【问题标题】:Get a list of relations ordered by pivot field in Laravel获取 Laravel 中按枢轴字段排序的关系列表
【发布时间】:2022-01-07 08:27:56
【问题描述】:

基本上我有属于许多用户的用户。我们可以想象用户之间的友谊关系。

所以我有一个关系的数据透视表,其中包含 2 个用户的 id 和一个附加字段“created_at”。


用户表:id、名称

friend_user 表:user_id、friend_id、created_at


在我的用户模型中,我有一个返回用户集合的好友函数:

public function friends() {
    return $this->belongsToMany(User::class, 'friend_user', 'user_id', 'friend_id');
}

我的目标是获取用户之间所有关系的列表。通过 User::all() 上的循环,我可以轻松获得所有这些关系,一个又一个用户:

$users = User::all();
foreach ( $users as $user ) {
   foreach ( $user->friends as $friend ) {
       return [$user->name . 'is friend with ' . $friend->name];
   }
}

但我想让它们按“created_at”排序,而不是关系中的用户。

有没有一种简单的方法可以通过 eloquent 或其他方式来做到这一点?

感谢您的帮助。

【问题讨论】:

    标签: mysql laravel eloquent dynamics-al


    【解决方案1】:

    您可以使用别名为 pivot 的数据透视表字段

    $user = User::with(['friends' => function($friendQuery) {
        $friendQuery->orderBy('pivot.created_at', 'desc');
    }])->get();
    

    【讨论】:

    • 返回一个 SQLState“列未找到:1054 'order 子句'中的未知列 'pivot.created_at'”。什么会为您返回此查询?
    【解决方案2】:

    你可以试试 User::orderBy('created_at')->get(); 或者如果你提到关系,你可以在关系中做同样的事情

    public function friends() {
    return $this->belongsToMany(User::class, 'friend_user', 'user_id', 'friend_id')->orderBy('created_at');}
    

    【讨论】:

    • 谢谢,但是这个函数返回给我 1 个用户的朋友,我需要获取friend_user 表的所有行,而不仅仅是那些引用特定用户的行。
    【解决方案3】:

    这可能有助于您首先将您的功能更改为这个

        public function friends() {
        return $this->belongsToMany(Friend::class);
    }
    

    然后在控制器中执行此操作

    $users = User::with('friends')->get();
    foreach ( $users as $user ) {
       
           return [$user->name . 'is friend with ' . $user->firends->name];
         }
    

    使用 dd($users) 检查您是否找到朋友关系。

    【讨论】:

    • 谢谢,但我没有朋友表或朋友模型。只是属于用户的用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2021-08-12
    • 2018-05-16
    • 2016-08-18
    • 2019-07-27
    相关资源
    最近更新 更多