问题:
上述内容中,标题和学年属于一个数据表。分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段。
需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索。
解决方法:
编写如下代码:
public function search($srcfrom) { // 整理变量 $src = [ ‘category‘ => ‘‘ ,‘searchval‘ => ‘‘ ,‘status‘ => ‘‘ ,‘bfdate‘ => ‘‘ ,‘enddate‘ => ‘‘ ]; $src = array_cover($srcfrom, $src) ; if(isset($srcfrom[‘bfdate‘]) && strlen($srcfrom[‘bfdate‘]) > 0) { $src[‘bfdate‘] = $srcfrom[‘bfdate‘]; }else{ $src[‘bfdate‘] = date("Y-m-d", strtotime("-6 year")); } if(isset($srcfrom[‘enddate‘]) && strlen($srcfrom[‘enddate‘]) > 0) { $src[‘enddate‘] = $srcfrom[‘enddate‘]; }else{ $src[‘enddate‘] = date("Y-m-d", strtotime(‘4 year‘)); } // 查询数据 $data = $this ->whereTime(‘bfdate|enddate‘, ‘between‘, [$src[‘bfdate‘], $src[‘enddate‘]]) // ->alias("c") ->withJoin( // "glCategory" [ ‘glCategory‘=>function($query){ $query->field(‘id, title‘); }, ] ) ->when(strlen($src[‘searchval‘]) > 0, function($query) use($src){ $query->where("xueqi.title|glCategory.title|xuenian", ‘like‘, ‘%‘ . $src[‘searchval‘] . ‘%‘); }) ->when(strlen($src[‘category‘]) > 0, function($query) use($src){ $query->where(‘category‘, $src[‘category‘]); }) ->when(strlen($src[‘status‘]) > 0, function($query) use($src){ $query->where(‘status‘, $src[‘status‘]); }) // ->with( // [ // ‘glCategory‘=>function($query){ // $query->field(‘id, title‘); // }, // ] // ) ->select(); file_put_contents(‘D:\log.txt‘,$this->getLastSql()); return $data; }
在上述搜索中,我们利用withJoin进行关联。同时,利用
$query->where("xueqi.title|glCategory.title|xuenian", ‘like‘, ‘%‘ . $src[‘searchval‘] . ‘%‘);
这里的易错点:
当关联多表进行关键字搜索的时候,当前表和关联表都有title字段。我们在写sql语句的时候,会直接用title和glCategory.title进行区分。
但是在tp的世界里,必须注明模型xueqi.title(model的类名叫Xueqi,但是在where中,用首字母小写的xueqi即可)。
同时,对于没有多表重复的xuenian子弹,我们不需要注明xueqi。这也是sql和tp模型的一些不同之处。