Сделать так, чтобы Laravel Accessor возвращал результаты запроса - PullRequest
0 голосов
/ 11 ноября 2018

ОБНОВЛЕНИЕ:

Я пытаюсь добавить свой собственный атрибут с результатами подзапроса к результатам основного запроса.

Теперь у меня есть связь «многие ко многим» между тремя столами: турниры, участники и пользователи.

Вот определение отношения в модели Турниров:

public function users() {
    return $this->belongsToMany('App\User', 'Participants', 'Id_tourn', 'Id_user')->withPivot('Rating');
}

Структура таблиц:

Users:
-Id
-Name

Participants:
-Id
-Id_user
-Id_tournament
-Final
-Final_place

Tournaments:
-Id
-Name

Мне нужно иметь дополнительный атрибут Winners в моем конечном результате запроса, где у меня будет информация о первых трех местах.

Следуя документации, я создал аксессор и попробовал разные варианты:

  1. Это просто заморозить систему. Ничего не происходит, и через 30 секунд я получаю ошибку тайм-аута.

    public function getWinnersAttribute() { return Tournaments::where("Id","=",$this->attributes['Id'])->where("Finals","=",1)->limit(3)->orderBy("Final_place","asc")->get(); }

  2. Возвращает ошибку, из-за которой столбец «финалов» не является источником в таблице турниров, поэтому $this не имеет отношения:

    public function getWinnersAttribute() { return $this->where("Finals","=",1)->limit(3)->orderBy("final_place","asc")->get(); }

  3. Возвращает пустую белую страницу без чего-либо:

    public function getWinnersAttribute() { return $this->with('users')->where("Finals","=",1)->limit(3)->orderBy("final_place","asc")->get(); }

  4. Этот возвращаемый атрибут "Победители" пуст:

    public function getWinnersAttribute() { return $this->with("users")->where("Finals","=",1)->limit(3)->orderBy("final_place","asc"); }

Я создал $appends переменную для применения метода доступа: protected $appends = ['Winners'];

Однако я проверил аксессор, он работает. Если я вернусь только:

public function getWinnersAttribute()
{
    return "123";
}

все работает нормально, и я получаю "123" внутри "winners" атрибут основного результата запроса.

Основной запрос:

Tournaments::with(['users'])->get();

Столбец Finals находится в сводной таблице отношения «многие ко многим».

ОБНОВЛЕНИЕ: Когда я пытаюсь вернуть запрос к этой модели без отношения:

public function getWinnersAttribute($value)
{
    return $this->where("Finals",'=',2);
}

Я тоже ничего не получаю в атрибуте winners. Вроде подзапрос не выполняется.

И если я добавлю get() в конце возврата:

return $this->where("Finals",'=',2)->get();

Я получаю пустую белую страницу. Как я могу решить эту проблему?

Большое спасибо.

1 Ответ

0 голосов
/ 11 ноября 2018

Если getWinnersAttribute на модели Турнира, это означает, что у вас уже есть модель Турнира, которую вы вызываете, например, Tournament::find(1)->winners В вашем атрибуте вы пытаетесь найти модель снова, и это может сделать ее навсегда цикл пытается найти новый, уже имеющий один и т. д. попробуйте использовать $this вместо

public function getWinnersAttribute()
{
    return $this->where("finals","=",1)->limit(3)->orderBy("final_place","asc")->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...