雄辩的关系

时间:2014-10-26 21:24:35

标签: laravel laravel-4 eloquent

我有点麻烦找到设置我的模型关系的最佳和正确的方法来获取下面的一些数据......

我的计划是显示内容,具体取决于 content_type ,其中的链接是来自Users表的 id user_id 表单UserData表。这些都是用户 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

我希望有人能够看到我的目的是什么并知道解决方案。

2 个答案:

答案 0 :(得分:0)

从我看到的,您正在尝试为用户提供动态数据吗?

如果是这样,您将有两个选择:

1)利用多态关系,每个content_type都有一个类,在获取时,它会将它转换为类,然后在类中,你可以覆盖__toString方法来显示你想要的它。 您可以在此处找到有关多态关系的更多信息:http://laravel.com/docs/4.2/eloquent#polymorphic-relations

2)您可以添加另一列,说明如何呈现它,并在每次打印时手动处理不同的content_type,或者在模型中添加方法以根据需要返回它们。

现在,关于UserData和User之间的关系,您将拥有OneToMany关系,因此,您将拥有User模型:

public function data(){
     return $this->hasMany("UserData");
}

在UserData模型中:

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

答案 1 :(得分:0)

在用户模型中设置两个关系:

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圈内)。