雄辩关系
林有一点麻烦找建立我的模型关系,以获取一些我下面的数据最好的和正确的方法...雄辩关系
我的计划是,以显示内容取决于content_type和之间的链接是来自Users表的id和来自UserData表的user_id。这些都是这两种模式过于用户和的UserData
用户表
*id* *username* *password*
1 johndoe 123
2 janedoe 321
的UserData表
*user_id *content* *content_type*
1 John Doe full_name
1 john-doe.jpg avatar
1 laravel twitter
1 blue favorite_color
2 Jane Doe full_name
2 jane-doe.jpg avatar
2 Eloquent twitter
2 green favorite_color
我希望有人可以看到我的目的,知道一个办法。
套装在您的用户模型中建立两个关系:
public function data() {
return $this->hasMany('UserData');
}
public function dataOfType($type) {
return $this->hasOne('UserData')->where('content_type', $type);
}
然后,您可以将所有关联的数据与特定用户(用户1,在这种情况下)与
$userData = User::find(1)->data;
或者,你可以指定一个特定的content_type检索:
$userData = User::find(1)->dataOfType('avatar')->content;
要获取所有用户,与它们相关的数据一起:
$users = User::with('data')->get();
您不能使用预先加载的dataOfType
关系,因为with
声明不接受参数(这是为了与你指定需要content_type)。如果您需要为多个用户执行此操作并希望使用急切加载(例如,您希望让所有用户使用他们的头像),则可以使用加载约束而不是您的dataOfType
关系。
$users = User::with(array('data' => function($query)
{
$query->where('content_type', 'avatar');
}))->get();
例如,对于一个特定的用户,让他们full_name
值,你可以运行:
$userFullName = User::find(1)->dataOfType('full_name')->content;
或者,让所有的用户与他们的full_name
值:
$users = User::with(array('data' => function($query)
{ $query->where('content_type', 'full_name'); }
))->get();
...并且可以访问每个用户的值(在foreach ($users as $user)
循环内)在$user->content
。
从我看到的情况来看,您正尝试为用户提供动态数据吗?
如果是这样,您将有两个选择:
1)使用多态关系,在那里你将有一个类为每个CONTENT_TYPE,并取时,将其转换为类,然后里面该类,您可以覆盖__toString方法以根据需要显示。 你可以找到更多关于多态关系在这里:http://laravel.com/docs/4.2/eloquent#polymorphic-relations
2),你可以添加另一列该会说如何呈现它,打印时,或添加方法模型他们返回作为对待不同CONTENT_TYPE手动每次你要。现在
,有关的UserData和用户之间的关系,你将有一个一对多的关系,所以,你更是预示了在用户模式:
public function data(){
return $this->hasMany("UserData");
}
而在的UserData模式:
public function user(){
return $this->belongsTo("User");
}
我现在就建立了关系。我如何获得* content * where * content_type *是full_name? – 2014-10-26 21:54:58
我不能得到多态关系的工作..你介意显示一个例子吗? – 2014-10-27 18:28:27