【问题标题】:How can I relate Model A to either Model B OR Model C in Laravel?如何将模型 A 与 Laravel 中的模型 B 或模型 C 相关联?
【发布时间】:2013-10-14 12:04:50
【问题描述】:

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

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

我有一种强烈的感觉,我会以错误的方式解决这个问题。我是否应该将 User 模型与两者联系起来,并在使用关系之前进行检查(起初这似乎很明显,但也不是完全正确的方法)?有没有更好的方法来做到这一点?

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

【问题讨论】:

  • 检查多态关系。这可能正是您所需要的,并且您已经为它进行了设置。基本上你会找到你的用户,调用关系,它会返回一个代理或执行者的实例。 laravel.com/docs/eloquent#polymorphic-relations

标签: php laravel database-schema eloquent


【解决方案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
}

【讨论】:

  • 哈!我将多态用于其他模型,但我什至没有考虑过这个模型。那是我的愚蠢。非常感谢!
  • 啊,好的,我对您的回答有疑问。如果用户是代理或执行者,它可以工作,但如果用户只是普通用户怎么办?用户不必是这两种特殊用户类型中的任何一种。
  • 您可能会将用户表变形为自身。我还没有测试过这样做,但我假设它应该可以正常工作。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多