Как получить модифицированные отношения Laravel - PullRequest
0 голосов
/ 08 октября 2018

У нас есть модели: вопрос и ответ.

В таблице ответов у нас есть логический столбец с именем accepted, и у нас есть только один принятый Ответ.Мы хотим получить вопрос с его ответами и принять ответ отдельно.

Я использую два подхода, но я не знаю, какой из них лучше:

1).проверьте, загружено ли отношение, если загружены отношения фильтра, и получите принятый ответ, подобный этому:

if(!$this->relationLoaded('answers')){
            $this->load('answers');
        }
        return $this->answers->firstWhere('accepted',true);

2).Мы также можем использовать этот подход:

function accepted_answer(){
  return $this->answer()->where('accepted',true);
}

Проблема второго подхода заключается в том, что мы получаем массив, но мы ожидаем один ответ или ноль.Есть ли лучший подход к этому, или мы не можем использовать ни 1, ни 2?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Создайте модель Accessor на Question.

class Question extends Model
{
    public function getSelectedAnswerAttribute()
    {
        return $this->answers->where('accepted', true)->first();
    }
}

Теперь в каждом экземпляре Answer есть атрибут с именем selected_answer.

.

$answer->selected_answer;

Примечание

этот 'selected_answer' не выбирается из базы данных, он фильтрует из списка уже выбранных ответов.поэтому он более эффективен, чем ваш второй подход.

и, если вы хотите, чтобы этот атрибут автоматически связывался с моделью Question всегда.добавить это accessor к appends массиву.

Модель

protected $appends = ['selected_answer'];
0 голосов
/ 08 октября 2018

создайте accepted область в вашей answer модели.

public function scopeAccepted($query){
   return $query->where("accepted",true)->first();
}

, тогда вы можете легко получить первый принятый ответ.

$question->answer()->accepted();

для более подробной проверки области запросов ;

0 голосов
/ 08 октября 2018

Вы должны использовать подход second , так как у вас будет один источник, который будет изменен позже, если что-то изменится (вместо того, чтобы копаться в большом количестве контроллеров)

Чтобы получить результатиспользуйте ->get(); в конце запроса построителя.

PS: Области действия обычно всегда лучше, чем написание запросов вручную внутри контроллера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...