2017-04-10 2 views
0

Ich habe folgende komplexe Abfrage und möchte es in Laravel verwenden. Aber bis jetzt hatte ich keinen Erfolg. Vielleicht könnte einer von Ihnen zeigen, wie man es in den Abfrage-Generator von Laravel "übersetzt".Wie übersetzt man eine komplexe Abfrage in den Laravel Query Builder?

Hier ist die ursprüngliche Abfrage, die in Workbench funktioniert gut:

select * from lemma l 
inner join etymology e on l.id=e.lemma_id_fk 
inner join gloss g on e.id = g.etymology_id 
inner join wold_meanings w on g.gloss=w.meaning 
where g.gloss like '%flower%' #paper, ocean, etc. 
limit 100; 

, als ich versuchte, die folgenden:

$results = DB::table('lemma') 
    ->join('etymology', 'lemma.id', '=', 'etymology.lemma_id_fk') 
    ->join('gloss', 'etymology.id', '=', 'gloss.etymology_id') 
    ->join('wold_meanings', 'gloss.gloss', '=', 'wold_meanings.meaning') 
    ->select(DB::raw('lemma.*')) 
    ->where('gloss.gloss', 'like', '%flower%') 
    ->get(); 

und auch:

$results = DB::table('lemma') 
    ->select(DB::raw("select * from lemma l 
    inner join etymology e on l.id=e.lemma_id_fk 
    inner join gloss g on e.id = g.etymology_id 
    inner join wold_meanings w on g.gloss=w.meaning 
    where g.gloss like '%flower%' 
    limit 1")); 

und diese auch:

$results = DB::raw("select * from lemma l 
    inner join etymology e on l.id=e.lemma_id_fk 
    inner join gloss g on e.id = g.etymology_id 
    inner join wold_meanings w on g.gloss=w.meaning 
    where g.gloss like '%flower%' 
    limit 100"); 

Aber ich hatte absolut keinen Erfolg ... :-(

Wer mir den richtigen Weg zeigen? Ich benutze Laravel 5.4.

== EDIT # 1 ==

Hier ist der Ansicht, in der die Ergebnisse angezeigt werden sollen:

 <table class="table table-bordered table-condensed table-hover table-responsive table-striped" id="table"> 
      <thead> 
       <tr> 
        <th>id</th> 
        <th>lemma_id</th> 
        <th>headword</th> 
        <th>lemma</th> 
        <th>pos</th> 
        <th>gender</th> 
        <th>language</th> 
        <th>origin_family</th> 
        <th>origin</th> 
        <th>short_path</th> 
        <th>origin_path</th> 
        <th>etymology_text</th> 
        <th>first_use</th> 
        <th>lang</th> 
        <th>pageid</th> 
        <th>term</th> 
        <th>non_latin_script</th> 
        <th>lang_2</th> 
        <th>gloss</th> 
        <th>sequence</th> 
        <th>lemma_id_fk</th> 
        <th>derivatives_id</th> 
        <th>etymology_id</th> 
        <th>meaning</th> 
        <th>semantic_category</th> 
        <th>semantic_field</th> 
        <th>simplicity_score</th> 
        <th>age_score</th> 
        <th>borrowed_score</th> 
        <th>description</th> 
        <th>typical_context</th> 
        <th>representation</th> 
        <th>sub_code</th> 
       </tr>    
      </thead> 

      <tbody> 
      @foreach($results as $result) 
       <tr> 
        <td>{{$result->id}}</td> 
        <td>{{$result->lemma_id}}</td> 
        <td>{{$result->headword}}</td> 
        <td>{{$result->lemma}}</td> 
        <td>{{$result->pos}}</td> 
        <td>{{$result->gender}}</td> 
        <td>{{$result->language}}</td> 
        <td>{{$result->origin_family}}</td> 
        <td>{{$result->origin}}</td> 
        <td>{{$result->short_path}}</td> 
        <td>{{$result->origin_path}}</td> 
        <td>{{$result->etymology_text}}</td> 
        <td>{{$result->first_use}}</td> 
        <td>{{$result->lang}}</td> 
        <td>{{$result->pageid}}</td> 
        <td>{{$result->term}}</td> 
        <td>{{$result->non_latin_script}}</td> 
        <td>{{$result->lang_2}}</td> 
        <td>{{$result->gloss}}</td> 
        <td>{{$result->sequence}}</td> 
        <td>{{$result->lemma_id_fk}}</td> 
        <td>{{$result->derivatives_id}}</td> 
        <td>{{$result->etymology_id}}</td> 
        <td>{{$result->meaning}}</td> 
        <td>{{$result->semantic_category}}</td> 
        <td>{{$result->semantic_field}}</td> 
        <td>{{$result->simplicity_score}}</td> 
        <td>{{$result->age_score}}</td> 
        <td>{{$result->borrowed_score}}</td> 
        <td>{{$result->description}}</td> 
        <td>{{$result->typical_context}}</td> 
        <td>{{$result->representation}}</td> 
        <td>{{$result->sub_code}}</td> 
       </tr> 
      @endforeach 
      </tbody> 
     </table> 

== EDIT # 2 ==

Nur ein paar andere Tests haben hier und erkannte, dass bei der Verwendung

$results = DB::table('lemma') 
    ->join('etymology', 'lemma.id', '=', 'etymology.lemma_id_fk') 
    ->join('gloss', 'etymology.id', '=', 'gloss.etymology_id') 
    ->join('wold_meanings', 'gloss.gloss', '=', 'wold_meanings.meaning') 
    ->select(DB::raw('lemma.*')) 
    ->where('gloss.gloss', 'like', '%flower%') 
    ->get(); 

gibt es m e das Ergebnis nur aus dem Tabellen-Lemma, d. h. es ignoriert die Joins. So bekomme ich Ergebnisse in der Tabelle der Ansicht von <td>{{$result->id}}</td> bis <td>{{$result->pageid}}</td>, aber nicht den Rest.

+0

Irgendwelche Fehler oder falsche Ergebnisse? –

+0

Die letzte sollte definitiv funktionieren, da es die gleiche rohe Abfrage ist. Was bekommen Sie in $ Result/$ results' Variable und was erwarten Sie? –

+0

@MayankPandeyz weder Fehler noch falsche Ergebnisse ...Ich sehe, ich sehe nur die thead der Tabelle, während die Ergebnisse in den tbody erscheinen sollten. Und nichts in der Konsole. –

Antwort

1

Wenn Sie den Anruf von der Kette zu select() entfernen, wird es funktionieren.

select Die Methode stellt die SELECT Teil einer Abfrage. Auf diese Weise schreibt folgendes:

->select(DB::raw('lemma.*')) 

Es ist das gleiche wie:

SELECT lemma.* FROM ... 

Mit anderen Worten: Sie sind nur die Spalten aus lemma Tabelle.

Da jedoch Sie wollen auch die Spalten aus anderen Tabellen wählen, dass ein Teil Ihres Kette Weglassen wird der Query Builder zu seinem Standardverhalten machen Rückfall, die gleich wie:

SELECT * FROM ... 

Wenn Sie Sie möchten, dass Sie explizit angeben, was Sie auswählen, und dabei dasselbe erreichen: