【问题标题】:Manually add item to existing object [Laravel 5]手动将项目添加到现有对象 [Laravel 5]
【发布时间】:2015-10-07 02:15:13
【问题描述】:

这是我尝试做的:

$q = Question::where('id',$id -> id)->get();
$q[] = $q->push([ 'test' => true]); 
dd($q);

这将输出:

Collection {#220 ▼
  #items: array:3 [▼
    0 => Question {#225 ▶}
    1 => array:1 [▼
      "test" => true
    ]
    2 => null
  ]
}

所以'test' => true 将作为一个新键追加,但我想将它插入Question 以便以后我可以像这样使用foreach $q -> test 访问它

这就是我想要访问项目的方式:

@foreach($q as $qq)
{{ $qq->test }}
@endforeach

【问题讨论】:

  • 我不明白 1 件事:问题::where('id',$id -> id)->get();为什么您不使用主键获取元素: Question::find($id); ?
  • 当行的集合总是唯一的时候,这很有趣(:
  • 如果我使用find 是否可以添加新的随机属性?到现有对象
  • 当然可以,但是你会失去它的 ORM 功能。
  • 好的,我该怎么做?

标签: php arrays collections eloquent laravel-5


【解决方案1】:

可以使用 Eloquent Model (https://github.com/illuminate/database/blob/master/Eloquent/Model.php) 的 setAttribute() 函数来完成。
如您所见,它使用 setAttribute() 将数据存储在 protected $attributes 中,而当我们使用 $SomeModel->some_field 时,它使用魔法方法__get()attributes 数组中通过关联检索项目。

这是您的问题的解决方案:

$Question = Question::find($id);
$Question->setAttribute('test', 'blablabla');

【讨论】:

  • 它只会创建新对象,不会向我现有的对象添加属性...我从数据库中获取属性:$q = Question::where('id',$id -> id)->get(); 我需要在该属性上添加新属性。
  • 我不确定它的语法好吗?我得到:Cannot pass parameter 1 by reference
  • 现在更好,但不要在它添加到对象末尾的属性中添加新项目。有什么办法解决吗?
  • 尝试第二种方式,使用 Eloquent 的 setAttribute 方法
【解决方案2】:

除了setAttribute(),您还可以使用put() 参考此post 的一项。和map() 的许多项目,请参阅此post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多