[英]Laravel model relationships Class not found
在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个模型: Users , Pages , Group_pages和Groups 。 所以在模型中,我定义了这样的关系:
用户模型:
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();
但这给了我错误:
找不到类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');
}
}
模型文件应单独命名并以驼峰形式命名,即User
, Page
, Group
。 表示用户和组之间的连接的模型不是必需的。
然后,在定义关系时,第一个参数是模型的类名:
class User {
public function group()
{
return $this->belongsTo('Group', 'local_key', 'parent_key');
}
}
你违背了Laravel的惯例,让自己的生活变得困难。
如果按照Laravel的约定命名列,则无需在关系定义中指定它们。 因此,您的users
表应该有一个名为group_id
的列,该列是引用groups
表中id
列的外键。 然后你的关系可以这样表达:
class User {
public function group()
{
return $this->belongsTo('Group');
}
}
更简洁,更易于阅读,您不必记住本地和外部列名称的方式。
您可以在官方文档中阅读有关Laravel用于模型和关系名称的约定的更多信息: http ://laravel.com/docs/master/eloquent#relationships
您使用不存在的模型类定义了您的关系。
要解决此问题,请创建group_page-model(或更好的GroupPage)并更改相应的关系(在Group-model中返回$ this-> hasMany('GroupPage','group_id','id');
然后在User
-model中修复关系:
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();
我总是喜欢向Laravel推荐Laracasts,他们是Laravel的新手(我希望你还不知道)。 基本的截屏视频都是免费的( laravel 4 from scratch and laravel 5 fundamendals ),你很快就能快速出镜! 具体来说,看一下关于Eloquent Relationsships的剧集。
我也强烈建议坚持惯例
users
group_id
上使用column-name group_id
。 Group
,而不是group
,当把它们作为参数提交时,坚持它( belongsTo('Group')
)... 这让生活更轻松!
最后
请注意,您可能会尝试使用软件包。 我想到的是Entrust。
你用这个代码让你的生活变得艰难,因此你无法使它生效。
首先检查一下:
// 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.