2014-06-18 25 views
0

我有表,'jobs',由job_id索引,和與外鍵'job_id'進行表討論。Laravel - 使用兩個表的位置之間的連接

在作業中,我有一個名爲'summary'的專欄,並且在討論中有一個名爲'body'的專欄。我想在這兩個表中的這兩列中搜索相同的文本字符串,並返回適用的作業。

例如,如果job_id = 7的工作記錄在'summary'列中包含字符串'somestring',並且討論記錄具有外鍵job_id = 20並且具有'somestring'字符串,我希望工作記錄爲job_id = 7和job_id = 20返回。

我正在使用laravel。我無法找到一個解決方案,這是我得到的最接近:

$query->join('discussions', function($join) use ($search_term){ 
       $join->on('jobs.job_id', '=', 'discussions.job_id'); 
       $join->where('discussions.body', 'LIKE', $search_term);      
       $join->orWhere('jobs.summary', 'LIKE', $search_term);         
      }) 

但這只是返回一切從我的討論桌。有沒有人有什麼建議?

謝謝:)

回答

1

有SQL問題這一點。你在做什麼基本上是這樣的:

SELECT * FROM jobs INNER JOIN discussions ON (...) jobs.summary LIKE search_term 

沒有WHERE條款,而該部分(...)不要緊(簡化一點),因爲有OR,所以實際上你不(不僅)加入key/fk對上的表。

你只需要轉移這些where出去了聯接封閉的,它會按預期工作:

$query->join('discussions', function($join) { 
    $join->on('jobs.job_id', '=', 'discussions.job_id'); 
}) 
    ->where('discussions.body', 'LIKE', $search_term) 
    ->orWhere('jobs.summary', 'LIKE', $search_term) 
    ->get(); 

現在,您的查詢看起來像它應該:

SELECT * FROM jobs INNER JOIN discussions ON jobs.id = discussions.job_id 
    WHERE discussions.body LIKE search_term 
    OR jobs.summary LIKE search_term 
+0

感謝您的解釋。我遵循上面提到的,儘管查詢按照您的說法進行渲染,但我仍然只能從討論表中找回結果。 jobs.summary中包含文本的作業將被忽略。 – Ste77

+0

查詢是肯定的,但也許你需要'leftJoin'而不是(內部)'join'呢? –

+0

乾杯,左加入已經做到了,我現在得到正確的結果:)非常感謝。然而,job_id字段在作業表中返回的結果中現在是空的。任何想法爲什麼會發生? – Ste77

0

試試這個,看看什麼出來吧;)

$query->join('discussions', function($join) use ($search_term){ 
       $join->on('jobs.job_id', '=', 'discussions.job_id') 
       ->where('discussions.body', 'LIKE', $search_term)      
       ->orWhere('jobs.summary', 'LIKE', $search_term);        
      }) 
     ->select('*') 
     ->get(); 

編輯:我將取代$query用正確的DB::table('mytable')

DB::table('jobs')->join('discussions', function($join) use ($search_term){ 
       $join->on('jobs.job_id', '=', 'discussions.job_id') 
       ->where('discussions.body', 'LIKE', $search_term)      
       ->orWhere('jobs.summary', 'LIKE', $search_term);        
      }) 
     ->select('*') 
     ->get(); 

EDIT2:我錯過了semicolumn,糾正

+0

歡呼聲,但仍只是拋出討論表中的一切... – Ste77

+0

那麼你必須更加具體的選擇條款@ Ste77 – clod986