【问题标题】:How to "translate" a complex query to Laravel Query Builder?如何将复杂的查询“翻译”到 Laravel Query Builder?
【发布时间】:2017-04-11 19:03:38
【问题描述】:

我有以下复杂的查询,想在 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");

但我绝对没有成功... :-(

有人告诉我正确的方法吗?我正在使用 Laravel 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();

它只给我来自表引理的结果,即它忽略了连接。所以我在视图表中收到了从&lt;td&gt;{{$result-&gt;id}}&lt;/td&gt;&lt;td&gt;{{$result-&gt;pageid}}&lt;/td&gt; 的结果,但不是其余的。

【问题讨论】:

  • 有任何错误或您得到的结果不正确?
  • 最后一个肯定可以工作,因为它是相同的原始查询。你在$result/$results 变量中得到了什么,你期待什么?
  • @MayankPandeyz 既没有错误也没有不正确的结果......我的观点是我只看到表格的头部,而结果应该出现在 tbody 中。控制台中也没有任何内容。
  • @GustavoStraube 我在变量中什么也没得到。我希望在 foreach 中看到许多结果。我将编辑问题并显示视图部分。
  • 关于你的编辑#2,我想如果你删除select( ... ) 部分,你会得到你想要的。

标签: php laravel-5.4 laravel-query-builder


【解决方案1】:

从链中删除对select() 的调用将使其工作。

select 方法表示查询的 SELECT 部分。这样,写如下:

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

同理:

SELECT lemma.* FROM ...

换句话说,您只是从lemma 表中选择列。

但是,由于您还想从其他表中选择列,因此省略链的这一部分将使查询生成器回退到其默认行为,这与以下内容相同:

SELECT * FROM ...

如果您想明确说明您选择的内容,这样做可以达到同样的效果:

->select('*')

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 2014-05-30
    • 2015-05-12
    • 1970-01-01
    • 2019-05-19
    • 2014-04-10
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多