Laravel中使用模型的嵌套查询等价物

wfveoks0  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(117)

在Laravel中寻找Query的等价物。

SELECT *
FROM  (
   SELECT * FROM tbl
   ORDER  BY updated_at
   LIMIT  20
   )
ORDER  BY random()
LIMIT  5;

字符串
请假设我们有一个已经存在的模型类“TableA”。内部查询可以使用。

TableA::OrderByRaw('updated_at ASC NULLS FIRST')->limit(20)->get();

pjngdqdw

pjngdqdw1#

您可以使用子查询来完成此操作。我更喜欢这种方式,因为它看起来更具可读性。

<?php

$rows = TableA::whereIn('id', function($query){
        $query->select('id')
              ->from('table_a')// name of the model table
              ->orderByRaw('updated_at ASC NULLS FIRST')
              ->limit(20);
    })->orderByRaw('random()')->limit(5)->get();// use ->toSql() instead of ->get() to see the actual raw query

dd($rows);

字符串

**注意:**对于MySQL用户,您可以使用连接来避免This version of MariaDB doesn't yet support 'LIMIT &amp; IN/ALL/ANY/SOME subquery'错误。请参阅here

使用联接使查询同时适用于Maria DB和Posterre,如下所示:

<?php

$subQuery = TableA::orderBy('updated_at')->limit(20);
$rows = TableA::joinSub($subQuery, 'derived_table', function($join){
         $join->on('tbl.id', '=', 'derived_table.id');
        })->inRandomOrder()->limit(5)->get();

dd($rows);


请参阅Join Subquery Docs

z18hc3ub

z18hc3ub2#

这是一种滑稽,但我修改了以下查询(等效的结果)。

SELECT *
FROM  tbl WHERE id IN (
   SELECT id FROM tbl
   ORDER  BY updated_at
   LIMIT  20
   )
ORDER  BY random()
LIMIT  5;

字符串
这个版本最终占用更少的数据库内存(用于处理),并且执行时间非常相似。
请注意:这在我的例子中是有效的,因为My“in”子句永远不会超过150个元素。
这可以在laravel中实现,

TableA::whereIn('id', function ($query) {
                    $query->select('id')->from('tbl')
                        ->OrderByRaw('updated_at ASC NULLS FIRST')
                        ->limit(20);
                })->inRandomOrder()->limit(5);

相关问题