ОБНОВЛЕНО:
Я пытаюсь добавить свой собственный атрибут с результатами подзапроса к результатам основного запроса.
Теперь у меня есть связь «многие ко многим» между тремя столами: турниры, участники и пользователи.
Вот определение отношения в модели Турниров:
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
атрибут в моем конечном результате запроса, где у меня будет информация о первых трех местах.
Следуя документации, я создал аксессор и попробовал разные варианты:
Это просто заморозить систему. Ничего не происходит, и через 30 секунд я получаю ошибку тайм-аута.
public function getWinnersAttribute() {
return Tournaments::where("Id","=",$this->attributes['Id'])->where("Finals","=",1)->limit(3)->orderBy("Final_place","asc")->get();
}
Это возвращает ошибку о том, что столбец «финал» не найден в таблице турниров, поэтому $this
не имеет отношения:
public function getWinnersAttribute()
{
return $this->where("Finals","=",1)->limit(3)->orderBy("final_place","asc")->get();
}
Это возвращает пустую белую страницу без чего-либо:
public function getWinnersAttribute()
{
return $this->with('users')->where("Finals","=",1)->limit(3)->orderBy("final_place","asc")->get();
}
Этот возвращаемый атрибут Winners пуст:
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);
}
Я ничего не получаю в атрибуте победителей. Вроде подзапрос не выполняется.
И если я добавлю get()
в конце возврата:
return $this->where("Finals",'=',2)->get();
Я получаю пустую белую страницу.
Как я могу решить эту проблему?
Большое спасибо.
Если getWinnersAttribute
на модели Турнира, это означает, что у вас уже есть модель Турнира, которую вы вызываете, например, Tournament::find(1)->winners
В вашем атрибуте вы тоже пытаетесь найти модель снова, и это может сделать это бесконечным циклом, пытаясь найти новую, уже имеющую такую и т. Д., Попробуйте использовать $this
вместо
public function getWinnersAttribute()
{
return $this->where("finals","=",1)->limit(3)->orderBy("final_place","asc")->get();
}
Других решений пока нет …