手动将项目添加到现有对象 [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]的主要内容,如果未能解决你的问题,请参考以下文章