Laravel 雄辩的关系

Laravel 雄辩的关系,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我有点麻烦找到最好的和正确的方法来建立我的模型关系,以获取我的一些数据下面 我的计划是根据内容类型来显示内容,其中的链接是Users表中的id和UserData表中的UserID。这两个模型也是用户和用户数据 用户表 用户数据表 我希望有人能了解我的目的,并知道解决方案。从我的了解来看,您正在尝试为用户提供动态数据,对吗 如果是,您将有两个选择: 1利用多态关系,每个内容类型都有一个类,在获取时,它会将其转换为类,然后在类内部,您可以重写uu toString方法以显示所需的内容。 您可以在此处

我有点麻烦找到最好的和正确的方法来建立我的模型关系,以获取我的一些数据下面

我的计划是根据内容类型来显示内容,其中的链接是Users表中的id和UserData表中的UserID。这两个模型也是用户和用户数据

用户表

用户数据表


我希望有人能了解我的目的,并知道解决方案。

从我的了解来看,您正在尝试为用户提供动态数据,对吗

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

1利用多态关系,每个内容类型都有一个类,在获取时,它会将其转换为类,然后在类内部,您可以重写uu toString方法以显示所需的内容。 您可以在此处找到有关多态关系的更多信息:

2您可以添加另一列,说明如何显示它,并在每次打印时手动处理不同的内容类型,或向模型中添加方法以按需返回它们

现在,关于UserData和User之间的关系,您将有一个OneToMany关系,因此,在用户模型中:

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

public function dataOfType($type) {
    return $this->hasOne('UserData')->where('content_type', $type);
}
在UserData模型中:

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

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

public function data(){
     return $this->hasMany("UserData");
}
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;
或者,您可以指定要检索的特定内容类型:

$userData = User::find(1)->dataOfType('avatar')->content;
要获取所有用户及其关联数据,请执行以下操作:

$users = User::with('data')->get();
不能使用dataOfType关系进行即时加载,因为with语句不接受指定内容类型所需的参数。如果您需要为多个用户执行此操作,并且希望使用即时加载,例如,您希望获得所有用户及其化身,您可以使用即时加载约束,而不是dataOfType关系

$users = User::with(array('data' => function($query)
{
    $query->where('content_type', 'avatar');
}))->get();
例如,对于特定用户,要获取其全名值,您可以运行:

$userFullName = User::find(1)->dataOfType('full_name')->content;
或者,要获取所有用户的全名值:


…每个用户的值都可以在$user->content的foreach$users as$user循环中访问。

我现在设置了关系。如何获取内容类型为全名的内容?我无法使多态关系正常工作。。你介意举个例子吗?
$users = User::with(array('data' => function($query)
    { $query->where('content_type', 'full_name'); }
))->get();