問題:
上述內容中,標題和學年屬於一個數據表。分類則屬於另外一個數據表,並且是利用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模型的一些不同之處。