【问题标题】:How to select multiple row values coma separated in laravel如何选择在laravel中以逗号分隔的多个行值
【发布时间】:2020-10-17 22:37:13
【问题描述】:

我正在尝试在进行雄辩的关系时将所有带有逗号的 id 分开。

这是我目前的查询

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 的列,它可以有一些 id 和一些留空。因此,对于元关系,我想在元对象内用逗号分隔的字符串检索 winAgainst id。

为了更好地理解,下面是Divrankmeta 表的样子

我该怎么做?

谢谢。

【问题讨论】:

  • 你没有从Divrankmeta获取winAgainst

标签: laravel eloquent


【解决方案1】:

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

我从不将修改代码放入 eloquent 函数中。这些代码似乎属于其他地方。从我的角度来看,使用“资源”并修改数据是一个更好的主意。

如果您选择这样做:

// 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);
}

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

【讨论】:

  • 感谢您的评论,它对我的​​回答有效。它有一对多的关系,但我需要一个数据对象,因此一对一的关系与一组 by 放置,因此它只返回一条记录。 :)
【解决方案2】:

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

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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多