如何按关系列过滤 Laravel

问题描述 投票:0回答:2

如何按关系列过滤

尝试过这个
        ->whereHas('customer',function ($query) use ($order){
            $query->orderBy('first_name', $order);
        })
还有这个
        ->with(['customer' => function ($query) use ($order) {
            $query->orderBy('first_name', $order);
        }])

两者都不起作用

php laravel sql-order-by relationship
2个回答
2
投票

with()
正在使用急切加载,这会将其变成两个查询。

您需要使用

join()
而不是
with()

$orders = Order
        ::join('customers', 'order.customer_id', '=', 'customers.id')
        ->orderBy('customers.first_name')
        ->get();

您可以使用

sortBy()
sortByDesc()
Collection
的方法。

例如:

$orders = Order
        ::with('customer')
        ->get()
        ->sortBy('customer.first_name');

0
投票

请求

{{host}}/admin/showcases?filterBy=companies:name
按相关栏目公司订购

如果简单的话

{{host}}/admin/showcases?filterBy=name
只会
orderBy("name")

->when(str_contains($filterBy, ':'),
                function (Builder $query) use ($filterBy, $order, $columns) {
                    $table = explode(':', $filterBy)[0];
                    $key = Str::singular($table) . "_id";
                    $column = explode(':', $filterBy)[1];
                    $selfTable = $this->getTable();
                    $query->leftJoin($table, "$selfTable.$key", "$table.id")
                            ->when($columns !== ['*'],
                                    function ($query) use ($columns, $selfTable) {
                                        $columns = array_map(function ($column) use ($selfTable) {
                                            return "$selfTable.$column";
                                        }, $columns);
                                        $query->select($columns);
                                    },
                                    fn($query) => $query->select(["$selfTable.*"]))
                            ->orderBy("$table.$column", $order);
                },
                function ($query) use ($filterBy, $order) {
                    $query->orderBy($filterBy, $order);
                })
© www.soinside.com 2019 - 2024. All rights reserved.