Как я могу связать модель A с моделью B или моделью C в Laravel?

Я использую Eloquent в Laravel 4 для создания трех разных моделей: модель User, модель Agent и модель Performer. Любой пользователь может зарегистрироваться как обычный пользователь или заплатить, чтобы стать Агентом ИЛИ Исполнителем. Поскольку и агенты, и исполнители имеют специальные профили, я создал отдельные таблицы для исполнителей и агентов, которые будут содержать их профили, и просто пользовательский "тип" в таблице "Пользователи", который указывает, являются ли они обычным пользователем, исполнителем. или агент.

Это означает, что модель User будет иметь отношение has_one как с Исполнителем, так и с Агентом. Поскольку пользователь когда-либо будет только одним из них, мне интересно, возможно ли, чтобы модель User относилась только к одному из них (или ни к одному), в зависимости от типа пользователя?

У меня сильное чувство, что я поступаю неправильно. Должен ли я связать модель User с обоими и просто проверить, прежде чем использовать отношения (которые сначала казались очевидными, но не совсем правильным)? Есть лучший способ сделать это?

РЕДАКТИРОВАТЬ: Я указал выше, что пользователь может быть не одним из них, а просто обычный пользователь, однако мне кажется, что я был слишком расплывчатым: поэтому, если пользователь не заплатил, чтобы стать ни агентом, ни исполнителем, они просто будь нормальным пользователем. Является ли наилучшей стратегией в этом случае просто вручную ввести "пользователя" для userable_type столбец и убедитесь, что он не равен "пользователю", прежде чем я $user->userable?

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
}
Другие вопросы по тегам