2013-06-02 34 views
6

我试图在'用户'表和'User_profiles'表之间建立一个非常直接的关系。每个用户都有一个user_profile,因此它是一个简单的一对一的。由于每@http://four.laravel.com/docs/eloquent#one-to-one我已经添加了以下功能到我的用户模型中发现的文档:Laravel 4雄辩的ORM通过动态属性访问一对一的关系

public function user_profile() 
{ 
    return $this->hasOne('User_profile'); 
} 

,这是我的User_profile模型中定义的关系:我从试图访问

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

像这样的控制器:

// Get current user 
    $user = User::find(Auth::user()->id); 
    $profile = $user->user_profile; 

    print_r($user); 
    print_r($profile); 

    echo "User's name is: " . $user->user_profile->first_name . ' ' . $user->user_profile->last_name; 

不幸的是,打印$ user打印出用户模型字段就好,但没有显示关系的任何痕迹; $配置文件是空的。 '关系'数组也是空的,我猜可能应该填充。

我试图用“动态属性”这里建议http://four.laravel.com/docs/eloquent#dynamic-properties

否则,如果我只是去:

echo "User's name is: " . $user->user_profile()->first()->first_name . ' ' . $user->user_profile()->first()->last_name; 

它的工作原理..但我真的不喜欢有这样做。

有什么建议吗?

回答

7

好的,所以问题必须在类名中使用下划线。 Laravel按照here的概述遵循PSR 0和1。

这是什么意思是我不得不命名我的模型类和文件名UserProfile(即使我的MySql表命名仍然'user_profiles'),然后更新我的用户模型有一个名为userProfile()的函数。

一旦我更新的命名,我可以做一些像自动访问的关系:

$user = Auth::user(); 
echo $user->userProfile->first_name; 
+1

我爱L4但这方面必须赶的人很多了。我有一个类似的问题,但在我的情况下,它与产品类型有关,事实证明我必须命名关系方法'productType()'而不是'producttype()'。感谢发布,希望它可以帮助其他几个人。 – JamesG

+0

是的,再加上令人讨厌的是重命名发生在诸如表格及其相关表格之类的对象上,但最终会回到表格字段本身的下划线命名,即first_name。这种不一致是轻度刺激。 – John