У меня проблемы с получением определенного набора результатов с моими отношениями Eloquent.
Модели:
Приложение (таблица: приложение) [Я бы, название, активный]
Вопрос (таблица: вопрос) [Я бы, application_id, question_text, helper_text, тип вопроса]
QuestionType (table: question_type) [Я бы, тип]
Жирный = первичный ключ, курсив = внешний ключ
Отношения:
Один Application
имеет много Questions
,
Много Questions
может принадлежать одному Application
,
Один Question
имеет один QuestionType
(ссылается на вопрос типа FK)
Один QuestionType
может принадлежать многим Questions
(ссылаясь на его идентификатор как тип вопроса)
QuestionType
является статической таблицей, в которую никогда не будут добавлены или удалены значения, однако атрибуты типа могут измениться.
Я хотел бы иметь возможность сделать что-то вроде этого:
$application = Application:find($application_id);
$questions = $application->questions()->get();
и это заменить question_type
с соответствующим типом, извлеченным из QuestionType
модель.
Я просмотрел документы Laravel и Eloquent, спросил о IRC и просмотрел другие статьи StackOverflow, но не смог найти ответ, который мне помог. Я думаю, что сбивает меня с толку, это мой необычный внешний ключ, question_type
, в моем Question
Таблица. Я получил его на работу один раз, исключение question_type
был заменен QuestionType
массив (который не будет работать).
Я бы сказал, сначала добавить это отношение к Question
:
public function type(){
return $this->belongsTo('QuestionType', 'question_type');
}
Тогда просто используйте его как обычно:
$question = Question::find(1);
$question->type;
И по всем вопросам приложения (с нетерпением загрузки)
$application = Application:find($application_id);
$questions = $application->questions()->with('type')->get();
Чтобы получить только фактическое имя типа (столбец с именем type
) вы можете добавить атрибут доступа. Однако с этим наименование становится немного сложнее. Если вы действительно не хотите менять имя внешнего ключа на question_type_id
Я предлагаю это:
public function typeRelation(){
return $this->belongsTo('QuestionType', 'question_type');
}
public function getTypeAttribute(){
if(is_null($this->typeRelation)) return null;
return $this->typeRelation->type;
}
Атрибут accessor позволяет использовать $question->type
и получить атрибут связанной модели напрямую. Не забудьте изменить имя отношения при активной загрузке: with('typeRelation')
Других решений пока нет …