【问题标题】:Make Laravel Accessor return query results让 Laravel Accessor 返回查询结果
【发布时间】:2018-11-11 17:04:14
【问题描述】:

更新:

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

现在,我在三个表之间建立了多对多关系:Tournaments、Participants 和 Users。

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

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. 这会返回一个错误,即“决赛”列不在 Tournaments 表中,因此 $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";
}

它工作正常,我在主查询结果的"winners" 属性中得到"123"

主要查询是:

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

Finals 列位于多对多关系的数据透视表中。

更新: 当我尝试将查询返回到没有关系的模型时:

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

我在获胜者属性中也一无所获。就像子查询没有执行一样。

如果我在返回末尾添加get()

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

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

非常感谢。

【问题讨论】:

  • 是锦标赛模型上的 getWinnersAttribute 吗?
  • @Casper,是的,是的
  • 获胜者实际上是锦标赛对象本身还是参与锦标赛的不同对象?
  • 为什么不创建关系?
  • @Pablo,我忘了提。我已经有一个关系,但我的“winners”属性中需要特殊的“where”子句。

标签: php laravel


【解决方案1】:

如果 getWinnersAttribute 在 Tournament 模型上,这意味着您已经有一个正在调用的 Tournament 模型,例如 Tournament::find(1)->winners 在您的属性中,您也正在尝试再次找到该模型,这可能使其永远存在循环试图找到一个已经有一个等的新的尝试使用 $this 代替

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

【讨论】:

  • 谢谢。我会在 15 分钟后检查那个版本并通知你。
  • 不幸的是,这不起作用,因为我需要将它与关系(内部关系)一起使用。我忘记说了。我会更新问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2021-11-01
  • 2013-10-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多