Как перевести сложный запрос в Laravel Query Builder?

У меня есть следующий сложный запрос, и я хотел бы использовать его в Laravel. Но пока у меня не было успеха. Возможно, кто-то из вас мог бы показать, как «перевести» его в конструктор запросов Laravel.

Вот исходный запрос, который хорошо работает в Workbench:

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;

Чем я пробовал следующее:

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

а также:

  $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"));

и это тоже:

  $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");

Но у меня не было абсолютно никакого успеха... :-(

Кто-нибудь, чтобы показать мне правильный путь? Я использую Ларавель 5.4.

== ИЗМЕНИТЬ №1 ==

Здесь представление, в котором должны отображаться результаты:

        <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>

== РЕДАКТИРОВАТЬ #2 ==

Просто сделал несколько других тестов здесь и понял, что при использовании

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

он дает мне результат только из табличной леммы, т. е. игнорирует соединения. Поэтому я получаю результаты в таблице представления от <td>{{$result->id}}</td> до <td>{{$result->pageid}}</td>, но не остальные.


person Aloysia de Argenteuil    schedule 10.04.2017    source источник
comment
Любая ошибка или вы получаете неверные результаты?   -  person Mayank Pandeyz    schedule 10.04.2017
comment
Последний определенно должен работать, так как это тот же необработанный запрос. Что вы получаете в переменной $result/$results и чего ожидаете?   -  person Gustavo Straube    schedule 10.04.2017
comment
@MayankPandeyz ни ошибок, ни неверных результатов ... На мой взгляд, я просто вижу заголовок таблицы, а результаты должны отображаться в теле. И в консоли тоже ничего.   -  person Aloysia de Argenteuil    schedule 10.04.2017
comment
@GustavoStraube Я ничего не получаю в переменной. Я ожидаю много результатов внутри foreach в представлении. Я отредактирую вопрос и покажу часть представления.   -  person Aloysia de Argenteuil    schedule 10.04.2017
comment
Я имею в виду, что вы получаете от var_dump($results);? Это null или что-то другое?   -  person Gustavo Straube    schedule 10.04.2017
comment
Что касается вашего редактирования № 2, я думаю, если вы удалите часть select( ... ), вы получите то, что хотите.   -  person Gustavo Straube    schedule 10.04.2017
comment
@GustavoStraube без select(...) сработало! Теперь я посмотрю, чтобы лучше понять, как такой сложный запрос должен быть транспонирован в сборку запроса Laravel. Как я могу отметить это как правильный ответ? Muito obrigado, me ajudou muito!   -  person Aloysia de Argenteuil    schedule 11.04.2017
comment
@AloysiadeArgenteuil добавил это в качестве ответа. Теперь вы можете принять/проголосовать за него.   -  person Gustavo Straube    schedule 11.04.2017


Ответы (1)


Удаление вызова select() из цепочки заставит его работать.

Метод select представляет SELECT часть запроса. Таким образом, написав следующее:

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

Это то же самое, что:

SELECT lemma.* FROM ...

Другими словами, вы выбираете только столбцы из таблицы lemma.

Однако, поскольку вы хотите также выбрать столбцы из других таблиц, исключение этой части вашей цепочки приведет к тому, что построитель запросов вернется к своему поведению по умолчанию, что аналогично следующему:

SELECT * FROM ...

Если вы хотите четко указать, что вы выбираете, это приведет к тому же:

->select('*')
person Gustavo Straube    schedule 11.04.2017