Laravel 5.4原始加入查询

时间:2017-07-23 06:03:44

标签: mysql laravel join left-join

我有一个用于存储博客帖子的表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;       
}

1 个答案:

答案 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。