Проблемы с получением правильных результатов с красноречивыми отношениями Laravel

У меня проблемы с получением определенного набора результатов с моими отношениями 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 массив (который не будет работать).

1

Решение

Я бы сказал, сначала добавить это отношение к 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')

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]