如何按关系列过滤
->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();
或
sortBy()
或sortByDesc()
Collection
的方法。
例如:
$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);
})