已更新:
我正在尝试将自己的带有子查询结果的属性添加到主查询的结果中。
现在,我在三个表之间建立了多对多关系:锦标赛,参与者和用户。
这是锦标赛模型中关系的定义:
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();
我得到空白的白页。 我该如何解决这个问题?
非常感谢。
答案 0 :(得分:1)
如果getWinnersAttribute
在Tournament模型上,这意味着您已经通过执行Tournament::find(1)->winners
来调用一个Tournament模型,在您的属性中,您也试图再次找到该模型,这可能使其成为一个永久循环,试图找到一个已经存在的新循环,等等。尝试使用$this
代替
public function getWinnersAttribute()
{
return $this->where("finals","=",1)->limit(3)->orderBy("final_place","asc")->get();
}