商品表的內容還是蠻多的,主要是表的一對多,多對多比較多,所以在查詢和新增的時候會有一些小難點,在這裡做一下筆記,以免以後踩坑。
#####首先說一下,表關聯之 ''一對多''。 打個比方,商品的一個品牌可以對應多件商品,那麼我們就可以這麼表示
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