laravel 定义“advance”具有一对多关系,该关系检索由具有特定角色的用户创建的最后一条(多条)记录

ktecyv1j  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(102)

假设Post模型存储用户创建的任何“post”,PostLog模型存储Post模型的更改日志,显然,PostPostLog具有hasMany()关系。
现在,我想在该关系之外定义一个has-one-of-many。PostLog具有user_id,它定义了进行更改的用户。我想检索由具有特定角色的用户创建的最新PostLog
对于usersroles表,它们的关系被建立为多对多,这意味着存在连接它们两者的role_user
这是我得到的最好的结果,但显然没有得到正确的值:

class Post extends Model
{
    public function latestAdminPostLog()
    {
        return $this->hasOne(PostLog::class)->ofMany([
            'id' => 'max',
            'created_at' => 'max'
        ], function ($query) {
            $query->whereExists(function ($qry) {
                $qry->select(DB::raw(1))
                    ->from('users')
                    ->join('role_user', 'users.id', '=', 'role_user.user_id')
                    ->join('roles', 'role_user.role_id', '=', 'roles.id')
                    ->whereColumn('users.id', 'post_logs.user_id')
                    ->whereIn('roles.name', ['admin-x', 'admin-y']);
            });
        });
    }
}

非常感谢你的帮助。谢谢!
注意:我使用santigarcor/laratrust包进行用户角色管理。

oaxa6hgo

oaxa6hgo1#

只管做

public function latestAdminPostLog(){
     return $this->hasOne(PostLog::class)->whereHas('user', fn (Builder $query) => $query->whereRoleIs(['admin-x', 'admin-y']))->latest();
}

这将返回由具有admin-x或admin-y角色的用户创建的最新PostLog
祝你今天愉快

相关问题