商品表的内容还是蛮多的,主要是表的一对多,多对多比较多,所以在查询和添加的时候会有一些小难点,在这里做一下笔记,以免以后踩坑。
#####首先说一下,表关联之 ''一对多''。 打个比方,商品的一个品牌可以对应多件商品,那么我们就可以这么表示
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