【问题标题】:Collections in Laravel. each function.Laravel 中的集合。每个功能。
【发布时间】:2015-08-08 05:37:39
【问题描述】:

我尝试按每个更改集合的元素。什么都没有发生。

最小示例:

$roles = $users->roles->each(function($role)
{
  $role->text = 'New text';
});

但不起作用... $roles 集合与.each 函数之前的集合一样。有什么帮助吗?

【问题讨论】:

  • 你有没有想过这个问题?在我的脑海中,看起来 $roles 集合是空的,或者您需要在闭包中调用 $role->save();

标签: laravel collections each


【解决方案1】:

使用map()方法代替each()

$users->roles->map(function($role)
{
    $role->text = 'New text';
});

阅读有关集合的简短文档:http://laravel.com/docs/5.0/collections

【讨论】:

  • 例如$roles = $user->roles->map(function($role) { $role->created_at = new \Datetime(); });回声 $roles->toJson();我得到 [null]
  • @Kostas 在map() 之前和之后(使用dd())使用集合转储更新您的问题。
  • @Kostas 向我们展示了您在之前和之后实际清洗和收集的代码。
  • @Kostas 地图的回调应该返回一个值;否则,结果是一个空集合。试试这个: $roles = $user->roles->map(function($role){$role->created_at = new \Datetime(); return $role; }); echo $roles->toJson();
【解决方案2】:

尝试传递引用

$roles = $users->roles->each(function(&$role)
{
  $role->text = 'New text';
});

或者这样:

$roles = $users->roles;
$roles->each(function($role)
{
  $role->text = 'New text';
});

编辑

正常的 foreach 工作吗?

$roles = $users->roles;
foreach($roles as &$role){
  $role->text = 'New text';
});

【讨论】:

  • 我知道这行不通!!!我正在努力如何从集合中更改元素,但似乎没有人提供方法!!!
  • 没有。做出答案,而不是问题:)
  • @limonte 很抱歉试图提供帮助。正常的 foreach 对我有用。我正在运行 4.2。如果这仍然不起作用,我建议在循环之后发布整个控制器或至少 dd($roles),问题可能出在其他地方。
  • 这应该可以。显然他还有其他问题,可能没有得到正确的收藏,或者在某个时候重置它。需要出示他的代码。
【解决方案3】:

我不知道它是否已解决,但我在进行联接的查询中发现了同样的问题。

问题可能是您在角色 Relation 中有一个联接。

我有,不工作:

\BF\Models\RentalBike::active()
    ->has('sizes')
    ->whereHas('bike', function ($q) {
      $q->active();
    })
    ->whereHas('rental', function ($q) {
      $q->active();
    })
    ->with([
        'sizes' => function ($q) {
          $q->join('sizes', 'size_id', '=', 'sizes.id')
              ->orderBy('sizes.weight')
              ->get(['rental_bike_size.id',
                  'rental_bike_size.size_id',
                  'rental_bike_size.rental_bike_id',
                  'sizes.name',
                  'sizes.weight'
              ])->each(function($o) {                    
                $o->setAttribute('stock_available', 123);
              });
        },
        'bike' => function ($q) {
          $q->get(['id', 'model', 'brand_id']);
        },
        'bike.brand' => function ($q) {
          $q->get(['id', 'name']);
        }
    ])
    ->get(['id', 'id as rental_bike_id', 'bike_id', 'price_id']);

解决方法:

return \BF\Models\RentalBike::active()
    ->has('sizes')
    ->whereHas('bike', function ($q) {
      $q->active();
    })
    ->whereHas('rental', function ($q) {
      $q->active();
    })
    ->with([
        'sizes' => function ($q) {
          $q->join('sizes', 'size_id', '=', 'sizes.id')
              ->orderBy('sizes.weight')
              ->get(['rental_bike_size.id',
                  'rental_bike_size.size_id',
                  'rental_bike_size.rental_bike_id',
                  'sizes.name',
                  'sizes.weight'
              ]);
        },
        'bike' => function ($q) {
          $q->get(['id', 'model', 'brand_id']);
        },
        'bike.brand' => function ($q) {
          $q->get(['id', 'name']);
        }
    ])
    ->get(['id', 'id as rental_bike_id', 'bike_id', 'price_id'])
    ->each(function($o) {
      $o->sizes->each(function($o){
        $o->setAttribute('stock_available', 'bar');
      });          
    });

注意 .each() 位置。

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2019-12-15
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多