我正在使用Laravel 4的Eloquent制作三种不同的模型:用户模型,代理模型和表演者模型。任何用户都可以注册为普通用户,或者可以付费成为代理人或执行者。因为代理和执行者都有特殊的配置文件,所以我为包含其配置文件的Performers和Agents创建了单独的表,并在Users表中创建了一个用户“type”,表明他们是普通用户还是Performer或代理商。
这意味着User模型与Performer和Agent都具有has_one关系。因为用户只会是其中之一,我想知道是否可以让用户模型只与其中一个(或没有)相关,具体取决于用户的类型?
我有一种强烈的感觉,我会以错误的方式解决这个问题。我应该将用户模型与两者联系起来,并在我使用关系之前检查一下(一开始看似很明显,但也不是正确的方法)?有更好的方法吗?
编辑:我在上面指出用户可能不是那些用户,而只是普通用户,但是看起来我太模糊了:所以,如果用户没有付钱成为代理人或表演者,他们我只是一个普通用户。在这种情况下,最好的策略是手动填写userable_type
列的“用户”,并在$user->userable
之前检查以确保它不等于“用户”吗?
答案 0 :(得分:1)
Schema::create('users', function($table)
{
$table->increments('id');
$table->string('username');
$table->string('imageable_type'); // Will be a string of the class name Agent or Performer
$table->string('imageable_id'); // Will be the ID of the Agent or Performer.
});
class User extends Eloquent
{
public function imageable()
{
return $this->morphTo();
}
}
class Agent extends Eloquent
{
public function user()
{
return $this->morphMany('User', 'imageable');
}
}
class Performer extends Eloquent
{
public function user()
{
return $this->morphMany('User', 'imageable');
}
}
$user = User::find(1);
$type = $user->imageable; // Type will be either an instance of Agent or Performer
if($type instanceof Agent)
{
// Do agent stuff
} else {
// Do performer stuff
}