Laravel Eloquent按最后一个枢轴记录过滤关系

时间:2016-10-19 09:27:24

标签: php mysql laravel orm eloquent

我有3张桌子: <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.edu</param-value> user和枢轴role。用户和角色之间存在多对多的关系。

还有一个细节,每个作业(用户角色)在user_role表中都有timestamp,因此我可以找到最近为用户添加的角色。

是否有可能编写一个雄辩的查询来让所有最近分配的角色的用户具有例如id = 5?

我需要以某种方式从user_role订购的pivot获取最后一条记录,然后在timestamp语句中使用它。但是如何获得最后的记录?

修改

感谢您的回答。但我想让它变得更加复杂。如果我们添加表whereHas,现在将在systemsystem之间建立一对多的关系,那么用户可以属于一个系统,系统可以拥有多个用户。

现在,如何获得,例如user的id,其中包含id = 5的最后一个角色的用户(如开头)。

3 个答案:

答案 0 :(得分:2)

您可以为您的关系添加数据透视列,如下所示:

/**
 * The roles that belong to the user.
 */
public function roles()
{
    return $this->belongsToMany('App\Role')->withPivot('timestamp');
}

然后,如果您想检查用户最近是否具有特定角色,请执行此操作

public function hasRecentRole($roleId, $howRecently = 'last week')
{
     return $this->roles()->where('id', $roleId)->wherePivot('timestamp', '>', new Carbon\Carbon($howRecently))->count();
}

编辑:尝试这样的事情。

$systems = System::whereHas('users', function ($query) {
    $query->whereHas('roles', function ($query) {
        $query->where('id', 5)
            ->whereRaw('timestamp = (select max(`timestamp`) from user_roles WHERE user_id = role_user.user_id'));
    });
})->get();

如果不是,也许你应该分步工作。就像获得具有最新角色5的用户一样,获得至少拥有其中一个用户的系统。

答案 1 :(得分:1)

这为$MyString表中timestamp列的最后一位用户提供了订单。

user_role

<强>更新

$user->roles()->withPivot('timestamp')->orderBy('user_role.timestamp','desc')->first();

然后,这给出了在数据透视表中按时间戳排序的所有用户的系统ID。

$users=User::with(['system','role'=>function($query)
{
   $query->orderBy('pivot_timestamps','desc');
}])->get();

确保您在用户和角色模型foreach($users as $user) { $user->system->id; } 中有关系,以便您可以使用withPivot.

pivot_timestamps

答案 2 :(得分:1)

首先,您需要确保您的关系包含数据透视时间戳:

public function users()
{
    return $this->belongsToMany('User')->withTimestamps();
}

然后,您可以在代码中使用以下查询来获取最近收到特定角色的所有用户(例如id = 5)。

$role = Role::with(['users', function($query) {
    $query->orderBy('pivot_created_at', 'DESC');
}])->find(5);

// all users with (role_id = 5) ordered by (user_role.created_at DESC)
$users = $role->users;