2017-05-24 2 views
1

Ich versuche, zwei Tabellen mit dem Larawel-Abfrage-Builder zu verbinden, aber ich habe ein Problem mit dem Abfrage-Generator bekommen das gewünschte Ergebnis, kann ich es aber ganz einfach mit einem rohen SQL-Anweisung. Ich möchte einfach alle Mod-Zeilen mit dem entsprechenden Wert in der tag Spalte in der tags Tabelle zurückgeben.Laravel Querybuilder Beitreten auf LIKE

Schema 

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

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

Arbeits SQL-Abfrage

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

Query Builder

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

Derzeit wird dies mir zu sagen: Unknown column '%FPS%' in 'on clause' aber ich bin nicht sicher, wie sonst diese zu strukturieren. Ich beabsichtige, mehr orOn Klauseln hinzuzufügen, sowie ich will Ergebnisse zu mehreren Tags erhalten, aber zuerst möchte ich nur ein einzelnes Tag arbeiten.

Schätzen Sie jede Hilfe.

+0

ist ‚FPS‘ Konstante oder eine Spalte? – sumit

+0

Sorry 'Tag' ist die Spalte, FPS ist der Wert. Ich werde das Schema veröffentlichen. Ich habe diesen FPS aus Gründen der Kürze fest programmiert, aber in der Praxis wird es eine Variable sein. – XanT

+0

Der dritte Parameter von Join in Laravel muss eine Spalte einer vorhandenen Tabelle sein. –

Antwort

0

Wenn Sie sehen möchten, was in der Datenbank ausgeführt wird, verwenden Sie dd (DB :: getQueryLog()) , um zu sehen, welche Abfragen ausgeführt wurden.

Versuchen Sie, diese Danke

+0

Dies sollte ein Kommentar anstelle einer Antwort sein – Gayan

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

Versuchen durch Ersetzen

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

Ihre Query Builder weigert mich, diese Abfrage zu generieren, weil es Unsinn ist!

Um korrekt zu funktionieren, muss eine JOIN-Klausel zwei Spalten auf Gleichheit vergleichen - eine Spalte auf jeder Seite der Join-Tabelle. Eine JOIN Klausel, die dies nicht tut, wird funktionell zu einer WHERE Klausel "heruntergestuft". Bei dieser Abfrage enden die beiden Tabellen kreuzweise.

Was möchten Sie wahrscheinlich ist:

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

* seufz * Natürlich. Danke, Dämmerwache. – XanT

1

Dies, weil die on Methode einen Namen eines Feldes kein Abfragewert warten, wenn Sie es mit ihm auf diese Weise behandeln wollen, sollten Sie DB::raw('%FPS%') verwenden.

Vielleicht versuchen Sie, so etwas wie die folgenden Funktionen ausführen:

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();