2017-05-24 86 views
1

我試圖使用Laravel的查詢構建器連接兩個表,但是我似乎遇到了使用查詢構建器獲得所需結果的問題,但是我可以很簡單地使用原始SQL語句獲取它。我只想返回tags表中tag列中具有相應值的所有mod行。Laravel Querybuilder加入LIKE

Schema 

-------------- 
mods 
-------------- 
id - int - (primary key) 
name - varchar 

-------------- 
tags 
-------------- 
id - int 
modid - int - (primary key of its parent mod) 
tag - varchar 

工作SQL查詢

SELECT * FROM mod JOIN tags ON tags.tag LIKE '%FPS%'

查詢生成器

DB::table('mods') 
->join('tags', function ($join) { 
    $join->on('tags.tag', 'like', '%FPS%'); 
}) 
->get(); 

目前,這是告訴我:Unknown column '%FPS%' in 'on clause'但我不確定是怎麼回事構建此。我打算增加更多的orOn子句以及我想要在多個標籤上得到結果,但首先我只想得到一個標籤工作。

感謝任何幫助。

+0

是「FPS」常量或一個列? – sumit

+0

對不起'tag'是該列,FPS是該值。我將發佈架構。爲了簡潔起見,我在那裏對FPS進行了硬編碼,但實際上它將是一個變量。 – XanT

+0

laravel中連接的第三個參數需要是現有表的一列。 –

回答

0

如果要查看數據庫中運行的內容,請使用 dd(DB :: getQueryLog()) 查看運行的查詢。

試試這個 謝謝

+0

這應該是一個評論,而不是一個答案 – Gayan

1
$join->on('tags.tag', 'like', '%FPS%'); 

嘗試通過更換

$join->where('tags.tag', 'like', '%FPS%'); 
3
SELECT * FROM mod JOIN tags ON tags.tag LIKE '%FPS%' 

你的查詢生成器拒絕,因爲這是無稽之談產生這個查詢!

爲了正常工作,JOIN子句需要比較兩列的相等性 - 連接表每一側的一列。 A JOIN子句不執行此操作從功能上「降級」到WHERE子句。在這個查詢的情況下,兩個表最終交叉連接。

你可能想要的是:

SELECT * FROM mod 
    JOIN tags ON tags.modid = mod.id 
    WHERE tags.tag LIKE '%FPS%'; 
+0

*嘆*當然。謝謝你duskwuff。 – XanT

1

這是因爲on方法等待一個字段不是一個查詢值的名字,如果你想讓它以這種方式處理它,你應該使用DB::raw('%FPS%')

也許你正在試圖做類似如下:

DB::table('mods') 
    ->select(DB::raw('mods.id as modid, mods.name, tags.id as tagid, tags.tag')) 
    ->join('tags', function ($join) { 
     $join->on('tags.modid', '=', 'mods.id'); 
    }) 
    ->where('tags.tag', 'like', '%FPS%') 
    ->get();