将一个with()结果对象的所有项放在Laravel 5.4中的字符串中

时间:2017-06-15 19:12:11

标签: laravel laravel-5 eloquent

我在Laravel 5.4中遇到了一个问题,并且有很多关系。 我需要对关系结果执行查询。

我将通过json结果解释我想要的内容,所以这是执行此Channel::with('categories')->get();后的正常结果:

[
  {
    "id": 87,
    "username": "ch1",
    "type": "channel",
    "members": 210424,
    "created_at": "2017-05-09 01:39:44",
    "updated_at": "2017-05-16 17:19:28",
    "categories": [
      {
        "id": 32,
        "title": "cat1",
        "created_at": "2017-05-10 10:04:46",
        "updated_at": "2017-05-10 10:04:46",
        "pivot": {
          "channel_id": 87,
          "category_id": 32
        }
      },
      {
        "id": 33,
        "title": "cat2",
        "created_at": "2017-05-10 10:04:46",
        "updated_at": "2017-05-10 10:04:46",
        "pivot": {
          "channel_id": 87,
          "category_id": 33
        }
      }
    ]
  }
]

我希望得到这样的结果:

[
  {
    "id": 87,
    "username": "ch1",
    "type": "channel",
    "members": 210424,
    "created_at": "2017-05-09 01:39:44",
    "updated_at": "2017-05-16 17:19:28",
    "categories": "cat1 , cat2"
  }
]

事实上,我需要字符串格式的所有类别,因为我必须在Channel列和with结果上执行多个查询。

更新

我想要做的最后一个查询就是这个:

Channel::orderBy('members', 'desc')
            ->with('categories')
            ->where([
                ['visible', 1],
                ['title', 'LIKE', '%' . $trend . '%'],
                ['members', '>', $members],
                ['category', 'LIKE', $category]])
            ->get()->skip($n)->take(10);

$trend$category$n是动态变量。

我需要使用skip()take()方法,因此我无法通过像每个行foreach这样的行为将我的数据类型从Collection更改为另一行!

1 个答案:

答案 0 :(得分:3)

基本上,就像@ceejayoz所说的那样,你会想要破坏已加载的类别。但是,由于您还想修改结果,我建议使用地图。这样的事情,虽然我现在不能测试代码。

$channels = Channel::with('categories')
    ->get()
    ->map(function ($channel) {
        $channel->categories = $channel->categories->pluck('title')->implode(' , ');

        return $channel;
    });