使Laravel Accessor返回查询结果

时间:2018-11-11 17:04:14

标签: php laravel

已更新:

我正在尝试将自己的带有子查询结果的属性添加到主查询的结果中。

现在,我在三个表之间建立了多对多关系:锦标赛,参与者和用户。

这是锦标赛模型中关系的定义:

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. 这将返回“ 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();

我得到空白的白页。 我该如何解决这个问题?

非常感谢。

1 个答案:

答案 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();
}