在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');
}
}
答案 0 :(得分:4)
模型文件应该以驼峰形式单独命名,即User
,Page
,Group
。表示用户和组之间的连接的模型不是必需的。
然后,在定义关系时,第一个参数是模型的类名:
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 scratch和laravel 5 fundamendals),您很快就能快速播出!具体来说,请看Eloquent Relationsships上的剧集。
我也强烈建议遵守惯例
group_id
- 表上的列名users
作为group-foreign-key。 Group
,而不是group
,并且在将它们作为参数提交时,坚持下去(belongsTo('Group')
)...... 这让生活变得更轻松!
<强>最后强>
请注意,您可能会尝试使用自己的软件包。我想到的是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