手动将项目添加到现有对象 [Laravel 5]

Posted

技术标签:

【中文标题】手动将项目添加到现有对象 [Laravel 5]【英文标题】:Manually add item to existing object [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 功能。 好的,我该怎么做? 【参考方案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 现在更好,但不要在它添加到对象末尾的属性中添加新项目。有什么办法解决吗? 这是图片:dodaj.rs/f/1o/ci/3p3OfzA3/screenshot-07172015-0345.png 尝试第二种方式,使用 Eloquent 的 setAttribute 方法【参考方案2】:

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

【讨论】:

以上是关于手动将项目添加到现有对象 [Laravel 5]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 wpf 中的代码添加现有项目

将避难所添加到现有项目时无法找到可发布的资源

Laravel 中的数组推送

如何自动将值添加到 Laravel 中的现有值

现有项目的 Laravel 火花?

将相同的外键添加到 4 行 Laravel