Laravel模型关系未找到类

时间:2015-03-18 09:14:09

标签: php mysql laravel laravel-4 model

在Laravel我刚开始使用模型,我有这个数据库结构:

users

id | username | password | group | //(group is the id of the group)


groups

id | groupname |


group_pages

group_id | page_id | create | read | update | delete


pages

id | pagename

我正在尝试检查用户是否可以在他所在的页面上创建/阅读/更新/删除。

所以我目前有4个型号:用户页面 Group_pages 群组。所以在模型中,我定义了这样的关系:

用户模型:

public function group()
{
    return $this->belongsTo('group', 'group', 'id');
}

群组模型:

public function users()
{
    return $this->hasMany('users', 'group', 'id');
}

public function group_pages()
{
    return $this->hasMany('group_pages', 'group_id', 'id');
}

我在我的控制器中使用这个:

$group_id = User::find(Session::get('user_id'));
$crud = Group::find($group_id->group)->group_pages()->first();

the documentation中所述。

但是这给了我错误:

  

未找到类group_pages

这里出了什么问题?

我不确定在关系中分配键。

我知道:

一对一反转:

return $this->belongsTo('class', 'local_key', 'parent_key');

一对多:

return $this->hasMany('class', 'foreign_key', 'local_key'); 

我不知道一对多反向。我知道它是:return $this->belongsTo('table');,但我不知道钥匙。

Group_pages模型:

class Group_pages extends Eloquent {

    public function pages()
    {
        return $this->belongsTo('pages', 'id', 'group_id');
    }

    public function group()
    {
        return $this->belongsTo('group', 'id', 'group_id');
    }

}

3 个答案:

答案 0 :(得分:4)

模型文件应该以驼峰形式单独命名,即UserPageGroup。表示用户和组之间的连接的模型不是必需的。

然后,在定义关系时,第一个参数是模型的类名:

class User {

    public function group()
    {
        return $this->belongsTo('Group', 'local_key', 'parent_key');
    }
}

你违背了Laravel的惯例,让自己的生活变得困难。

如果按照Laravel的约定命名列,则无需在关系定义中指定它们。因此,您的users表应该有一个名为group_id的列,该列是引用id表中groups列的外键。然后你的关系可以这样表达:

class User {

    public function group()
    {
        return $this->belongsTo('Group');
    }
}

更简洁,更易于阅读,您不必记住本地和外国列名称的方式。

您可以在官方文档中阅读有关Laravel用于模型和关系名称的约定的更多信息:http://laravel.com/docs/master/eloquent#relationships

答案 1 :(得分:1)

您使用不存在的模型类定义了您的关系。

要解决此问题,请创建group_page-model(或更好的GroupPage)并更改相应的关系(在组模型中返回$ this-> hasMany('GroupPage','group_id','id');

然后在User - 模型中修复关系:

public function group() // typo! not groep..
{
    return $this->belongsTo('group', 'group'); // remove id, you do not need it
}

然后您的控制器代码出现了问题,可能会出现这样的问题:

$group_id = User::find(Session::get('user_id'))->group()->id;
$crud = Group::find($group_id)->group_pages()->first();

我总是向拉拉维尔推荐Laracasts给人们(我希望你还不知道)。基本的截屏视频都是免费的(laravel 4 from scratchlaravel 5 fundamendals),您很快就能快速播出!具体来说,请看Eloquent Relationsships上的剧集。

我也强烈建议遵守惯例

  1. 使用group_id - 表上的列名users作为group-foreign-key。
  2. 类名应为PascalCase - > Group,而不是group,并且在将它们作为参数提交时,坚持下去(belongsTo('Group'))......
  3. 这让生活变得更轻松!

    <强>最后

    请注意,您可能会尝试使用自己的软件包。我想到的是Entrust。

答案 2 :(得分:0)

您使用此代码让您的生活更加艰难,因此您无法使其生效。

首先检查一下:

// This is User model, NOT group_id
$group_id = User::find(Session::get('user_id'));

下一步:

public function group() // I suppose groep was typo, right?
{
    // having relation with same name as the column
    // makes Eloquent unable to use the relation in fact
    return $this->belongsTo('group', 'group', 'id');
}

所以,这就是你需要的:

// User model
public function group()
{
    return $this->belongsTo('Group', 'group_id'); // rename column to group_id
}

// Group model
public function pages()
{
    return $this->belongsToMany('Page', 'group_pages')
        ->withPivot(['create', 'read', 'update', 'delete']);
}

然后:

$user = User::find(Session::get('user_id')); // or use Auth for this
$page = $user->group->pages()->find($currentPageId);
// now you can access pivot fields:
$page->pivot->create;
$page->pivot->update;
... and so on