Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将模型A与Laravel中的模型B或模型C关联?_Php_Laravel_Database Schema_Eloquent - Fatal编程技术网

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

Php 如何将模型A与Laravel中的模型B或模型C关联?,php,laravel,database-schema,eloquent,Php,Laravel,Database Schema,Eloquent,我正在使用Laravel4的Elount来创建三个不同的模型:用户模型、代理模型和执行者模型。任何用户都可以作为普通用户注册,也可以付费成为代理或表演者。因为代理和执行者都有特殊的配置文件,所以我为执行者和代理创建了单独的表,其中将包含他们的配置文件,并且在用户表中只包含一个用户“类型”,它指示他们是普通用户、执行者还是代理 这意味着用户模型将与执行者和代理都有一个has_one关系。因为一个用户只会是其中的一个,我想知道是否有可能让用户模型只与其中的一个相关(或者不相关),这取决于用户的类型

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

这意味着用户模型将与执行者和代理都有一个has_one关系。因为一个用户只会是其中的一个,我想知道是否有可能让用户模型只与其中的一个相关(或者不相关),这取决于用户的类型

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


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

检查多态关系。这可能正是你所需要的,你已经为它做好了准备。基本上,您将找到您的用户,调用关系,它将返回代理或执行者的实例。哈!我在其他模型中使用多态性,但我甚至没有想到这一个。我真傻。非常感谢!啊,好的,我有一个关于你答案的问题。如果用户是代理或执行者,它就可以工作,但是如果用户只是一个普通用户呢?用户不必是这两种特殊的用户类型中的任何一种。您可能会将用户表变形为自身。我还没有测试过这样做,但我认为它应该工作得很好。
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
}