【问题标题】:Laravel complex scope querying relation (for review)Laravel 复杂范围查询关系(供复习)
【发布时间】:2016-01-17 03:13:01
【问题描述】:

我写了这个,我只是想知道这是否是最好的方法。 订单有很多交易...交易属于订单。我正在查询 ID 大于发送到履行的最后一个 ID 的订单。那么我只想要已批准付款状态或离线付款类型的订单。

这段代码有效,只是想知道这是否是最好的方法:

/**
 * Get all orders pending fulfilment
 *
 * @param $query
 * @param $last_fulfiled
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeToFulfil($query, $last_fulfiled)
{
    return $query->where('id', '>', $last_fulfiled)
        ->where(function($query) {
        $query->whereHas('transactions', function ($query) {
            $query->where('status', '>=', 5);
        })->orWhere('payment_method', '=', 2);
    });
}

编辑:

这里是 SQL 语法:

select * from `orders` where `orders`.`deleted_at` is null and `id` > ? and ((select count(*) from `transactions` where `transactions`.`order_id` = `orders`.`id` and `status` >= ?) >= 1 or `payment_method` = ?)

谢谢!

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

    这绝对是构建此查询的正确 Laravel 方法。这几乎总是会生成相当优化的查询,通常是 LEFT JOIN 或子查询或两者的组合。

    如果您想查看结果查询的优化程度,请将->toSql() 添加到该查询语句的末尾,并在此处发布原始查询语法。

    【讨论】:

    • 感谢您的回答,我在回答中添加了 SQL 语法...让您意识到 Laravel 的帮助:)
    • 我认为构建的查询非常完美。只要您确保为您过滤的列建立索引,那就太好了。
    • 是的,我做到了...感谢您的帮助。
    猜你喜欢
    • 2014-01-16
    • 2018-01-20
    • 2017-06-15
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2017-05-10
    相关资源
    最近更新 更多