我正在尝试在做雄辩的关系的同时,将所有的ids与coma分开。
下面是我当前的查询
Divrank::where('division_id', 591)->with('meta')->orderBy('position', 'asc')->get()
Divrank
表与Divrankmeta
模型具有一对多的关系。因此,对于meta
,我试图返回
public function meta(){
return $this->hasOne(Divrankmeta::class)->selectRaw('id, match_id,divrank_id, sum(won) as won, sum(loss) as loss, sum(draw) as draw, sum(points) as points, sum(matchePlayed) as matchePlayed, sum(totalSets) as totalSets, sum(totalGames) totalGames')
->groupBy('divrank_id');
}
到目前为止,这个查询运行良好。
我得到如下截图所示的结果
好的,在我的Divrankmeta
模型中,我有一个名为winAgainst
的列,它可以有一些ids,也可以有一些留空。因此,通过元关系,我希望在元对象中使用coma分隔的字符串来检索winAgainst
ids。
为了更好地理解,下面是Divrankmeta
表的外观
我该怎么做呢?
谢谢。
发布于 2020-10-17 14:37:14
您创建的关系是一对一的,而不是一对多的。这就是为什么你得到的是第一个匹配行的元对象,而不是包含所有相关元记录的数组。
我从来没有把修改代码放入雄辩的函数中。这些代码似乎是其他地方的。从我的角度来看,使用“资源”和修改数据是一个更好的想法。
如果选择了do do:
// Divrank.php
public function metas()
{
return $this->hasMany('App\Models\Divrankmeta');
}
// Divrankmeta.php
public function divrank()
{
return $this->belongsTo('App\Models\Divrank');
}
// DivrankController
public function index()
{
return DivrankResource::collection(Divrank::with("metas")->all());
}
创建一个资源文件。
php artisan make:resource DivrankResource
现在,您可以在控制器返回资源文件之前修改资源文件上的Divrank集合。
public function toArray($request)
{
$metaIds = [];
forEach($this->metas as $meta) {
array_push($metaIds, $meta['id']);
}
$this['metaIds'] = $metaIds;
return parent::toArray($request);
}
我无法测试这段代码。但它可能会起作用。如果你不想使用资源,你也可以在你的控制器中创建相同的功能。但是我们希望控制器越短越好。
发布于 2020-10-17 14:26:26
好的,我想我已经解决了,这些是我所做的改变。谢谢
return $this->hasOne(Divrankmeta::class)
// ->selectRaw('id, match_id,divrank_id, sum(won) as won, sum(loss) as loss, sum(draw) as draw, sum(points) as points, sum(matchePlayed) as matchePlayed,
// sum(totalSets) as totalSets, sum(totalGames) totalGames')
->select(\DB::raw("id, match_id,divrank_id, sum(won) as won, sum(loss) as loss, sum(draw) as draw, sum(points) as points, sum(matchePlayed) as matchePlayed,
sum(totalSets) as totalSets, sum(totalGames) totalGames, GROUP_CONCAT(winAgainst) as winAgainst"))->groupBy('divrank_id');
https://stackoverflow.com/questions/64403106
复制