如何按关系列筛选 Laravel

How to filter by relation column Laravel

如何按关系列过滤

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

两个都不行

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

您需要使用 join() 而不是 with()

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

您可以使用 CollectionsortBy() or sortByDesc() 方法。

例如:

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

请求{{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);
                })