Как я могу связать модель 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
}