如何按关系列筛选 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();
或
您可以使用 Collection
的 sortBy()
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);
})
如何按关系列过滤
试过这个
->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();
或
您可以使用 Collection
的 sortBy()
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);
})