我有一个用于存储博客文章的表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;
}
最佳答案
您可以使用回调来创建更复杂的连接查询。
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
这是 laravel 文档上的链接 - https://laravel.com/docs/5.4/queries#joins “高级连接子句”部分。
更新:: 如评论中所述,为此类数据设置字符串并不是一个好主意。因为相等搜索应该比字符串检查简单得多。即使您的数据量应该没有太大差异,您也永远不知道您的应用程序将来会发生什么。
但如果你仍然想这样做,我认为你可以这样尝试
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
加入将检查 cat_id 中是否存在 id。
关于mysql - Laravel 5.4 原始连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262030/