【问题标题】:How to order column by relationship in Laravel Livewire如何在 Laravel Livewire 中按关系排序列
【发布时间】: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'));
}

}

Reference.

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


    【解决方案1】:

    基于这些帖子Ordering database queries by relationship columns in LaravelLaravel Eloquent whereColumn Query Example,我通过这种方式解决了按关系排序:

    我为关系设置了任何名称,在参数搜索功能中,比如说phone.number。

    然后,我使用 if 语句检测排序是否是这种关系:

    if($this->field == 'phone.number'){
        $users = $users->orderBy(\App\Models\Phone::select('number')->whereColumn('users.phone_id','phones.id'));
    }else{
        $users = $users->orderBy($this->field,$this->order);
    }
    

    此外,this answer 中解释了如何在列关系中进行搜索。

    【讨论】:

      【解决方案2】:

      你可以使用

      $user = User::search($this->search)
                   ->whereHas('phones', function ($q){
                          $q->orderBy('number', $order);
                    })
                    ->simplePaginate($this->perPage);
      

      而不是

      $users = User::search($this->search)
                     ->with(['phones' => function ($q) use($order){
                          $q->orderBy('number',$order);
                     }])
                     ->simplePaginate($this->perPage);
      
      

      【讨论】:

      • 我遇到以下错误:SQLSTATE[HY000]: General error: 20018 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified. [20018] (severity 15)
      猜你喜欢
      • 2014-06-25
      • 2019-05-14
      • 2019-08-29
      • 2015-04-22
      • 1970-01-01
      • 2019-06-17
      • 2021-11-09
      • 2016-11-10
      • 2019-12-01
      相关资源
      最近更新 更多