首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何选择在幼虫中分离的多个行值

如何选择在幼虫中分离的多个行值
EN

Stack Overflow用户
提问于 2020-10-17 21:40:58
回答 2查看 117关注 0票数 0

我正在尝试在做雄辩的关系的同时,将所有的ids与coma分开。

下面是我当前的查询

代码语言:javascript
运行
复制
Divrank::where('division_id', 591)->with('meta')->orderBy('position', 'asc')->get()

Divrank表与Divrankmeta模型具有一对多的关系。因此,对于meta,我试图返回

代码语言:javascript
运行
复制
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表的外观

我该怎么做呢?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-10-17 22:37:14

您创建的关系是一对一的,而不是一对多的。这就是为什么你得到的是第一个匹配行的元对象,而不是包含所有相关元记录的数组。

我从来没有把修改代码放入雄辩的函数中。这些代码似乎是其他地方的。从我的角度来看,使用“资源”和修改数据是一个更好的想法。

如果选择了do do:

代码语言:javascript
运行
复制
// 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());
}

创建一个资源文件。

代码语言:javascript
运行
复制
php artisan make:resource DivrankResource

现在,您可以在控制器返回资源文件之前修改资源文件上的Divrank集合。

代码语言:javascript
运行
复制
public function toArray($request)
{
   $metaIds = [];
   forEach($this->metas as $meta) {
     array_push($metaIds, $meta['id']);
   }
   $this['metaIds'] = $metaIds;
   return parent::toArray($request);
}

我无法测试这段代码。但它可能会起作用。如果你不想使用资源,你也可以在你的控制器中创建相同的功能。但是我们希望控制器越短越好。

票数 1
EN

Stack Overflow用户

发布于 2020-10-17 22:26:26

好的,我想我已经解决了,这些是我所做的改变。谢谢

代码语言:javascript
运行
复制
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');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64403106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档