Laravel 5.4 Raw Join Query

折月煮酒 提交于 2021-01-28 09:55:12

问题


I have a table TBL_POST used to store blog posts. A post can be assigned to multiple categories, there is a column, cat_id that stores category ID's in comma separated pattern like 2,4,6. I want to use FIND_IN_SET() method in this line

->leftJoin(TBL_CAT.' as c', 'p.cat_id', '=', 'c.id')

to show the associated category names. How can I do that?

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:


You can use callback to create more complicated join query.

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

Here is link on laravel doc - https://laravel.com/docs/5.4/queries#joins "Advanced Join Clauses" section.

UPD:: As mentioned in comment it is not good idea to have string for such types of data. Cause search by equality should be much simpler than string check. Even if your amount of data should not have big difference, you never know what will happen with your app in future.

But if you still want to do that i think you can try like this

->leftJoin(TBL_CAT, function($query){
     $query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})

Join that will check existence of id in cat_id.



来源:https://stackoverflow.com/questions/45262030/laravel-5-4-raw-join-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!