2017-07-23 58 views
1

我有一个表TBL_POST用于存储博客文章。一个帖子可以分配到多个类别,有一列cat_id存储类似ID的逗号分隔模式,如2,4,6。我想用FIND_IN_SET()方法在这一行Laravel 5.4原始联接查询

->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

其糟糕的方法来保存多对多的关系,最好创建一个第三表tbl_cat_post你只能从这里保存post_id和cat_id你可以加入,类别和张贴表, – umefarooq

+0

谢谢你的建议@umefarooq。我在想这个。 –

回答

0

您可以使用回调来创建更复杂的连接查询。

->leftJoin(TBL_CAT, function($query){ 
    $query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**"); 
}) 

这里是laravel文档链接 - 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"); 
}) 

加入,将检查ID存在于CAT_ID。

+0

我已经试过但没有运气 –

+0

编辑了一下。 –

+0

谢谢@Anton M,我会试试这个。是的,它不是个好主意,但如果我使用单独的表格来表达术语和发布关系,我必须加入5个表格。这就是为什么我使用这种方法。我认为不会有任何问题,因为它只会存储少量ID,只是为了显示帖子属于哪个类别。 –