注意:本例子都以衣服表和衣服sku表為例。
(衣服表:衣服的基本信息;衣服sku表:衣服不同規格的排列組合。易理解是說法,有款夾克衣服,那它的基本信息存衣服表,它不同尺寸和顏色排列組合得到的衣服信息存到衣服sku表)
1.場景一:通過衣服名稱搜索衣服基本信息
這個顯然是單模型搜索如
$where[] = ['goods_name','like','%'.$keywords.'%'];//模型中寫了搜索器的,直接寫成數組key=>value形式
GoodsModel::where($where);
2.場景二:查詢sku表的所有信息,並且關聯衣服基本信息
其實就是查出sku表但是關聯一下主表(因為也要顯示主表的一些信息)
//1.在GoodsSukModel中建立與GoodsModel一對一的關系 (如果goods到GoodsSuk關聯就是一對多了) /** * 一對一關聯 * @return \think\model\relation\HasOne */ public function goods() { //bind是把查出來的對象中指定字段取出來 return $this->hasOne(GoodsModel::class, 'id', 'goods_id')->where('is_del', 0)->bind(['goods_name','spu']); } //2.GoodsSukDAO中的調用 $with = ['goods']; GoodsSukModel::where()->with($with)
3.場景三:因為現在衣服sku是主模型,可通過顏色尺寸查詢sku信息
$where[] = ['size','=','xl']; $with = ['goods']; GoodsSukModel::where($where)->with($with)
4.場景四:如果上面的搜索功能想増加即按照主模型(GoodsSukModel)字段搜索,也能按照關聯模型衣服表的名稱搜索
$where[] = ['size','=','xl']; $hasWhere[] = ['goods_name','like','%夾克%']; //模型中寫了搜索器的,直接寫成數組key=>value形式
$with = ['goods']; GoodsSukModel::where($where)->hasWhere('goods',$hasWhere )->with($with)
參考 : https://www.kancloud.cn/manual/thinkphp6_0/1037600
5.場景五:我們知道在主模型(GoodsSukModel)搜索有 where和whereOr,但是關聯模型的搜索默認是and,怎么用or呢?
我們想按照,衣服表中的goods_name和衣服的款號搜索,只要任意匹配到都行?
$with = ['goods']; $field = []; $res = $this->getModel()->hasWhere('goods',function($query)use($keywords){ $query->where('goods_name', 'like', '%'.$keywords.'%')->whereOr('spu', 'like', '%'.$keywords.'%'); })->with($with)->whereOr('size','xl')->field($field)->paginate($size)->toArray();
也可以不用閉包,用下面的返回$where對象
參考(最下面):https://www.kancloud.cn/manual/thinkphp6_0/1037602