Laravel——商品模組難點

劍歌丶君發表於2018-04-13

商品表的內容還是蠻多的,主要是表的一對多,多對多比較多,所以在查詢和新增的時候會有一些小難點,在這裡做一下筆記,以免以後踩坑。

搞張圖撐撐場面!

#####首先說一下,表關聯之   ''一對多''。 打個比方,商品的一個品牌可以對應多件商品,那麼我們就可以這麼表示

class Brand extends Model
{
    //一個品牌會有多個商品
    public function product() {
        return $this->hasMany('App\Models\Shop\Product');
    }

}
複製程式碼

那麼反過來,也可以這麼理解,商品屬於品牌

class Product extends Model
{
    //多個商品屬於品牌
    public function brand() {
        return $this->belongsTo('App\Models\Shop\Brand');
    }

}
複製程式碼

那麼固然在product表裡面會有一個外來鍵欄位brand_id,這樣就可以將多個產品關聯到同一個brand下面了


接著是表之關聯   ''多對多''

多對多的話,比如一個產品可能屬於多種分類, 而一種分類可能也屬於多個產品。那麼表裡就不僅僅是一個外來鍵能解決了。而是需要一箇中間表來儲存他倆的對應關係。如下圖:

中間表
那麼他倆都需要belongsToMany 看以下兩表模型裡的程式碼

class Product extends Model
{
    //商品可以屬於多個分類
    public function categories() {
        return $this->belongsToMany('App\Models\Shop\Category');
    }
}
複製程式碼

而在分類表中也是一樣

class Category extends Model
{
    //商品可以屬於多個分類
    public function Product() {
        return $this->belongsToMany('App\Models\Shop\Product');
    }
}
複製程式碼

做完這些,你可能已經基本知道了多對多該如何應對了。但是又有一個問題來了,那就是,你沒了外來鍵的支撐,該如何將兩者的關係新增到中間表裡去呢?

laravel裡提供了這樣一個方法,用來將資料增加到中間表裡。
public function store(Request $request) {
    //將表單接收的資料新增到資料庫  返回的是該product記錄
    $product = Product::create($request->all());

    //將與之關聯的分類關係新增到中間表中
    $product->categories()->sync($request->category_id);
    注意categories就是模型裡的關聯方法, sync以接收陣列的形式接收外      
    鍵id。
}
複製程式碼
接下來是怎樣將表單的相簿,傳到Product的關聯表 ''product_galleries''表中。同樣的 我們需要根據product找到這張表

看程式碼:

public function store(Request $request) {
    $product = Product::create($request->all());
    //找到關聯表,然後將資料建立到表中
    這裡可能有多張圖片,所以用foreach迴圈
    foreach($request->imgs as $img) {
        $product->product_categories()->create(['img'=>$img]);
    }
    大功搞成  跳轉就自己寫了
}
複製程式碼

#####還有一個就是看下圖:

多條件查詢

看紅框框 多個條件查詢 怎麼搞呢? 直接上程式碼

public function index(Request $request) {
    $where = function($query) use ($request) {
        /商品名的模糊搜尋查詢
        if($request->has('name') && $request->name != '') {
            $query->where('name', 'like', '%'. trim($request->name) .'%');
        }

        /所有分類的條件查詢          '-1'是因為預設的所有分類是的value = '-1'
        if($request->has('category_id') && $request->category_id != '-1') {
            /根據中間表來查詢
            $product_ids = DB:table('category_product')
            ->where('category_id', $request->category_id)>pluck('product_id');
            /將與之對應的商品id取到,然後賦之條件
            $query->whereIn($product_ids);
        }
        
        //品牌條件查詢
        if($request->has('brand') && $request->brand != '-1') {
            $query->where('brand_id', $request->brand_id);
        }

        //是否上架下架查詢   這裡上架value = 1, 下架value = 0
        if($request->has('is_onsale') && $request->is_onsale != '-1') {
            $query->where('is_onsale', $request->is_onsale);
        }

        //時間區間查詢
        if($request->has('created_time') && ¥request->created_time != '') {
            $created_time_arr = explode('~', $request->created_at);
            $start_time = $created_time[0] . ' 00:00:00';
            $end_time = $created_time[1] . '23:59:59';
            $query->whereBetween('created_at', $start_time, $end_time);
        }
    }
    //根據以上條件查詢
    $products = Product::where($where)
              ->orderBy('is_top', 'desc')
              ->orderBy('id', 'desc')->paginate(env('pagesize'));
}
複製程式碼

謝謝觀看!純手打喲~@Lancer

相關文章