【问题标题】:No query results for model [App\Subreddit] when adding moderators to a forum category将版主添加到论坛类别时,模型 [App\Subreddit] 没有查询结果
【发布时间】:2016-01-02 17:20:36
【问题描述】:

我正在尝试将用户指定为论坛类别的版主。目前,我只是尝试显示用户可以添加版主subreddit/{id}/moderators 的路线并显示 subreddit 名称。

为此,我收到了No query results for model [App\Subreddit]

我一定是在某个地方弄乱了表之间的关系。

我的桌子

#users: id, name, email...
#subreddits: id, name, user_id...
#moderators: id, user_id, subreddit_id

Routes.php

Route::get('subreddit/{id}/moderators', [
    'as' => 'moderators',
    'uses' => 'ModeratorsController@create'
]);

Moderator.php模特

class Moderator extends Model
{
    protected $table = 'moderators';

    protected $fillable = ['user_id', 'subreddit_id'];

    public function subreddit() {
        return $this->belongsToMany('App\Subreddit');
    }

    public function user() {
        return $this->belongsTo('App\User');
    }
}

User 模型中,我有一个hasManyThrough

public function moderators() {
    return $this->hasManyThrough('App\Moderator', 'App\Subreddit');
}

Subreddit 模型中

public function moderators() {
    return $this->hasMany('App\Moderator');
}

然后在ModeratorsController我有以下create()方法

public function create(Moderator $moderator, Subreddit $subreddit, User $user)
{
    $subreddit = Subreddit::with('user')->findOrFail($subreddit->id);

    return view('user/moderators')->with('subreddit', $subreddit)->with('user', $user)->with('moderator', $moderator);
}

如果我将 findOrFail 更改为 firstOrFail,它将获得数据库中的第一个 subreddit,但我不想要第一个,我想要我试图添加版主的那个。

【问题讨论】:

  • 请张贴您的表格。您在模型上所做的肯定是错误的,因为如果主持人属于用户,则用户模型中的 hasManyThrough 关系是错误的。
  • 首先,我认为您的表中有冗余。这是一种不好的做法。为什么您将 user_id 保留在主持人表中,而您可以通过 subreddit 访问它?或者我可能误解了你要做什么。无论如何请解释一下:)
  • subreddits 表仅包含类别user_id 的创建者,而moderators 表允许将多个用户添加为版主。我正在尝试在这里创建一个视图,以允许 subreddit 的所有者添加版主。
  • 版主表格是一种枢轴吗?我的意思是它是否描述了用户和 subreddit 之间的多对多关系?
  • @Mithredate 是的,它是用户和 subreddits 的数据透视表。

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:
class User extends Model{
    public function canModerate(){ //name this as you wish
        return $this->belongsToMany('App\Subreddit','moderators');
    }
    public function subreddits(){
        return $this->hasMany('App\Subreddit');
    }
}

class Subreddit extends Model{
    public function moderators(){ // name this as you wish
        return $this->belongsToMany('App\User','moderators');
    }

    public function creator(){
        return $this->belongsTo('App\User');
    }
}

moderators 表中删除id,您将不需要Moderator 类。 可以在here 找到其他文档。

编辑RouteServiceProvider::boot 方法并添加以下行:

$router->model('subreddit', 'App\Subreddit');

文档可以在here找到。

您的路线应如下所示:

Route::resource('subreddit.moderator','ModeratorsController');

网址应类似于http://localhost/subreddit/{subreddit}/moderator/create

最后控制器方法应该是:

public function create(Subreddit $subreddit)
{
    $user = $subreddit->creator;
    $moderators = $subreddit->moderators()->get();
    return view('user/moderators')->with(compact('subreddit','user','moderators'));
}

【讨论】:

  • 我仍然无法检索我想要添加版主的类别的$subreddit->name,与以前相同的错误。而且我不理解creator() 函数,我从来没有在我的代码中使用过类似的东西。
  • 关于 creator() 函数,它只是描述 Subbreddit 模型和创建它的用户之间关系的命名。
  • @Mitherdate 我已经在RouteServiceProvider 中拥有了它,我也为App\Moderator 添加了一个。您的代码是为了让我检索给定 subreddit 的版主列表,是的。但我现在要做的就是在版主路线上显示 subreddit 的名称。问题依然存在。
  • 我希望这个可行,因为如果不可行,我真的没有更多的想法了。尝试Route::resource('subreddit.moderator','ModeratorsController'); 然后将/create 添加到您的网址。例如http://localhost/subreddit/2/moderator/create 看看是否有帮助。
  • 嗯,将路由参数传递给控制器​​方法应该有问题,所以我选择了最明显的方法,即通过 RESTful 资源控制器。这样,您始终可以确保参数按预期交付。顺便说一句,不客气;)
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多