如何将模型A与Laravel中的模型B或模型C相关联?

时间:2013-10-14 12:04:51

标签: php laravel database-schema eloquent

我正在使用Laravel 4的Eloquent制作三种不同的模型:用户模型,代理模型和表演者模型。任何用户都可以注册为普通用户,或者可以付费成为代理人或执行者。因为代理和执行者都有特殊的配置文件,所以我为包含其配置文件的Performers和Agents创建了单独的表,并在Users表中创建了一个用户“type”,表明他们是普通用户还是Performer或代理商。

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

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

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

1 个答案:

答案 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
}