Laravel: Eloquent如何在列名包含破折号时获取模型的属性?

10

我在我的根路由中有以下内容:

$user = User::all();
return $user->column-one;

尽管我在用户表中有一个名为column-one的列,但它返回异常使用未定义常量one-假定'one'。那么我该如何从我的模型中获取column-one


6
是的,你显然不能使用带有破折号的变量,因此出现了问题。你可能无法始终控制数据库,有时必须处理名称中带有破折号的列。指导文章作者正确使用Laravel的getAttribute函数比发表关于“学习PHP”的泛泛之谈更有帮助。 - thaspius
2
给那些想要点踩的人,这是我们中许多人面临或将面临的真正问题。在点踩之前,请阅读@thaspius的评论。 - Pooyan Khosravi
2个回答

20

在查看 Eloquent 模型的源代码后,我发现了一个神奇的魔术方法 __get 并且了解到它只是 getAttribute 这个公共函数的一个包装器,该函数接受一个字符串,因此现在我可以通过 $user->getAttribute('column-one'); 来检索列。

编辑:
请参见 @Alexandre Butynski 的下面的评论,以获得比我使用的更好的解决方案。


6
你的模型中应该使用getter方法,例如function getColumnOneAttribute(),这样你就可以像这样访问属性:$use->column_one。阅读文档:http://laravel.com/docs/eloquent#accessors-and-mutators。 - Alexandre Butynski
嗨@camelCaseD,你的解决方案有效。@Alexandre的想法对我不起作用。我有一个列名为U1-U2_max,并创建了一个访问器函数public function getU1U2MinAttribute($value){ return $value; }。问题是Laravel不知道如何在U1和U2之间放置破折号。如果它是U1和U2之间的下划线,则可以工作。访问器的目的是在从模型检索时格式化Eloquent属性。这对我有用{{ $post->resultats_electrique->getAttribute('U1-U2_min') }} - Fokwa Best

1

我没有尝试过这个,但是很好奇是否可以使用驼峰命名法来实现。对于路由之类的东西,它就是这样工作的。例如:$user->columnOne

但是我建议重新命名该列。在PHP应用程序中,这真的不太适合映射。

更新-尝试这个:

$user->{"column-one"}


遗憾的是,它返回了null。 - camelCaseD
谢谢,但是我在源代码中再多挖掘了一点后找到了下面的答案。 - camelCaseD
@camelCaseD:就算你的回答有一定价值,但可能会慢一些。我真的建议重命名那个列... :) - LF.
在发布之前尝试一下可能是个好主意。 - Mick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接