[英]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.