【发布时间】:2021-03-18 07:09:29
【问题描述】:
我刚刚关注了this tutorial,关于在 Laravel 中使用 Livewire 实现数据表。
到目前为止一切顺利。现在我想订购一个来自一对一关系的列,但在选择此phones 关系列时,我无法很好地进行排序。
在这种情况下,phones 是关系方法,number 是我在表格中显示的列,我也希望允许排序。
如何实现按列关系排序?
这是我的 livewire 刀片 (original repo of the tutorial) 代码的一部分:
<select wire:model="orderBy" class="...">
<option value="firstname">Name</option>
<option value="lastname">Lastname</option>
<option value="email">E-mail</option>
<option value="phones">Phone number</option>
</select>
...
<table class="table-auto w-full mb-6">
<thead>
<tr>
<th class="px-4 py-2">Name</th>
<th class="px-4 py-2">Lastname</th>
<th class="px-4 py-2">E-mail</th>
<th class="px-4 py-2">Phone number</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<td class="border px-4 py-2">{{ $user->firstname }}</td>
<td class="border px-4 py-2">{{ $user->lastname }}</td>
<td class="border px-4 py-2">{{ $user->email }}</td>
<td class="border px-4 py-2">{{ $user->phones->number }}</td>
</tr>
@endforeach
</tbody>
</table>
{!! $users->links() !!}
这里是 Livewire 控制器 (original repo of the tutorial):
类用户表扩展组件 { 使用 WithPagination;
public $perPage=5;
public $search = '';//Search string
public $orderBy='firstname';
public $orderAsc=true;
public $relationship_columns=['phones'];
public function render()
{
if(!in_array($this->orderBy,$this->relationship_columns)){
$users = User::search($this->search)
->orderBy($this->orderBy,$this->orderAsc ? 'asc' : 'desc')
->simplePaginate($this->perPage);
}else if($this->orderBy=='phones'){
$order = $this->orderAsc ? 'asc': 'desc';
$users = User::search($this->search)
->with(['phones' => function ($q) use($order){
$q->orderBy('number',$order);
}])
->simplePaginate($this->perPage);
}
return view('livewire.users-table',compact('users'));
}
}
phones 的排序(排序依据)效果不佳。似乎它对某些部分进行了很好的排序,但总的来说,排序是有缺陷的。既不能升序也不能降序。
看起来排序类型(asc,desc)在中没有生效
$q->orderBy('number',$order);
此外,如果我使用whereHas() 方法:
$order = $this->orderAsc ? 'asc': 'desc';
$users = User::search($this->search)
->whereHas('phones',function ($q) use($order){
$q->orderBy('number',$order);
})
->simplePaginate($this->perPage);
我收到以下错误:
SQLSTATE[HY000]: 一般错误:20018 ORDER BY 子句无效 在视图、内联函数、派生表、子查询和公共 表表达式,除非还指定了 TOP、OFFSET 或 FOR XML。 [20018](严重性 15)
我错过了什么?有关如何解决此问题的任何想法?
如何在 Livewire 的关系列上实现order by 功能?
【问题讨论】:
标签: laravel eloquent-relationship laravel-livewire