我有一个用于存储博客帖子的表TBL_POST
。可以将帖子分配到多个类别,有一列 cat_id ,以逗号分隔的模式存储类别ID,如 2,4,6 。我想在此行中使用 FIND_IN_SET()方法
->leftJoin(TBL_CAT.' as c', 'p.cat_id', '=', 'c.id')
显示相关的类别名称。我怎么能这样做?
public static function getPostWithJoin($status="")
{
$query = DB::table(TBL_POST .' as p')
->select('p.id','p.post_title','p.post_status','u.name as author','c.name as cat_name','p.updated_at')
->leftJoin(TBL_ADMINS.' as u', 'p.post_author', '=', 'u.id')
->leftJoin(TBL_CAT.' as c', 'p.cat_id', '=', 'c.id')
->where('p.post_type','post');
if($status!="all") {
$query->where('p.post_status',$status);
}
$query->orderby('p.id','DESC');
$data = $query->paginate(20);
return $data;
}
答案 0 :(得分:0)
您可以使用回调来创建更复杂的连接查询。
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
以下是laravel doc上的链接 - https://laravel.com/docs/5.4/queries#joins“高级加入条款”部分。
UPD :: 正如评论中所提到的,为这类数据提供字符串并不是一个好主意。因为相等的原因搜索应该比字符串检查简单得多。即使您的数据量不应有很大差异,您也永远不知道将来您的应用会发生什么。
但如果你仍然想这样做,我想你可以尝试这样做
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
加入将检查cat_id中是否存在id。