2013-10-14 132 views
0

我使用Laravel 4的Eloquent来制作三种不同的模型:一个用户模型,一个Agent模型和一个Performer模型。任何用户都可以以普通用户身份注册,或者可以付费成为代理或执行者。由于代理和执行者都有特殊配置文件,因此我为表演者和代理创建了包含其配置文件的单独表格,并且在用户表格中仅显示用户“类型”,表示它们是普通用户还是普通用户或代理商。如何将模型A与Laravel中的模型B或模型C相关联?

这意味着User模型将与Performer和Agent都有has_one关系。因为用户只会是其中的一员,所以我想知道是否有可能让用户模型仅与其中一个(或者没有)关联,具体取决于用户的类型?

我有一种强烈的感觉,我正在以这种错误的方式去做。我是否应该将用户模型与两者联系起来,并在使用关系之前进行检查(开始时似乎很明显,但也不是正确的方法)?有一个更好的方法吗?

编辑:我上面指出,用户可能不是那些,但只是一个普通用户,但它似乎我太模糊:所以,如果用户没有支付成为代理或执行者,他们只是一个普通的用户。在这种情况下,最好的策略是只需手动填写userable_type列的“用户”,并在执行$user->userable之前检查并确保它不等于“用户”?

+0

检查出多态关系。这可能正是你需要的,你已经有了自己的设置。基本上你会找到你的用户,调用关系,它会返回一个Agent或Performer的实例。 http://laravel.com/docs/eloquent#polymorphic-relations – user1669496

回答

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 
} 
+0

哈!我为其他模型使用多态,但我甚至没有考虑过这个。这真是愚蠢的我。非常感谢! – BenjaminRH

+0

啊,好的我有一个关于你的答案的问题。它适用于用户是代理还是执行者,但如果用户只是普通用户,该怎么办?用户不一定是这两种特殊用户类型中的任何一种。 – BenjaminRH

+1

你可能会将用户表变成自己。我还没有测试过,但我认为它应该可以正常工作。 – user1669496

相关问题