2017-07-23 60 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,只是爲了顯示帖子屬於哪個類別。 –