【发布时间】:2016-01-06 16:16:38
【问题描述】:
我猜这是模型关系错误,但我似乎无法确定。
我有 4 张桌子
users: id, name, email...
subreddits: id, user_id...
posts: id, title, subreddit_id, user_id...
moderators: id, user_id, subreddit_id...
我正在尝试通过热切加载“user.votes”和“subreddit.moderators”来获取所有帖子
$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
但我不断收到此错误
Connection.php 第 636 行中的 QueryException:
SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列'users.moderators'(SQL:select * from
userswhereusers.moderatorsin (17))
如果我单独使用subreddit 加载它,它会起作用,但我还需要获得 subreddit 的版主。
编辑:我从Subreddit 模型中的moderators() 方法中删除了moderators 字段,并将App\User 替换为App\Moderator,我现在可以获取相关的子reddit 及其版主。但是,访问$post->subreddit->moderators->user_id 给了我这个错误Undefined property: Illuminate\Database\Eloquent\Collection::$user_id
这些是我的模型
User模特
public function subreddit() {
return $this->hasMany('App\Subreddit');
}
public function posts() {
return $this->hasMany('App\Post');
}
public function votes(){
return $this->hasManyThrough('App\Vote','App\Post');
}
public function moderators(){
return $this->hasManyThrough('App\Moderator', 'App\Subreddit');
}
Subreddit模特
public function user() {
return $this->belongsTo('App\User');
}
public function posts() {
return $this->hasMany('App\Post');
}
public function moderators() {
return $this->hasMany('App\User', 'moderators');
}
Post模特
public function user() {
return $this->belongsTo('App\User');
}
Moderator 型号
public function subreddit() {
return $this->belongsTo('App\Subreddit');
}
public function user() {
return $this->belongsTo('App\User');
}
public function posts() {
return $this->belongsTo('App\Post');
}
public function subreddit() {
return $this->belongsTo('App\Subreddit');
}
public function votes() {
return $this->hasMany('App\Vote');
}
public function moderators() {
return $this->hasMany('App\Moderator');
}
Vote模特
public function user() {
return $this->belongsTo('App\User');
}
public function posts() {
return $this->belongsTo('App\Post');
}
AuthServiceProvider中的网关授权
$gate->define('update-post', function ($user, $post, $isModerator) {
// Check if user is subreddit owner
if ($user->id === $post->subreddit->user->id) {
return true;
}
// Check if user is the post author
if ($user->id === $post->user_id) {
return true;
}
// Check if user is a moderator of a subreddit
if ($isModerator) {
return true;
}
return false;
});
【问题讨论】:
-
您的用户模型中是否有“版主”列?
-
我在 User 模型中有一个
moderators()方法和这个return $this->hasManyThrough('App\Moderator', 'App\Subreddit'); -
是的,但是
Subreddit模型中的moderators()函数会在您的用户模型上查找moderators键(您将“主持人”指定为第二个参数,即外键) -
我明白了。不,我的数据库中没有任何
moderators字段。我应该删除它并使用App\Moderator而不是 App\User 吗? -
@Drown 我已经更新了我的原帖,请看一下。
标签: php laravel model laravel-5 eloquent