我正在使用laravel 4.2并在db中使用属性is_active
的表。
当我尝试访问此模型属性时:
$model->is_active
我收到了以下错误:
关系方法必须返回类型为Illuminate \ Database \ Eloquent \ Relations \ Relation
的对象
所以问题是如何访问这个属性? 如果可能,请不要建议在数据库中重命名此字段,因为这已经是生产中的现有数据库。
这是我的模特课:
class Position extends \Eloquent {
protected $table = "hr_positions";
protected $fillable = ['slug', 'info_small', 'info_full', 'is_active', 'start_date', 'end_date', 'tags', 'user_create_id', 'user_update_id'];
use \MyApp\Core\StartEndDateTrait;
public function postulations(){
return $this->hasMany('Postulation', 'position_id', 'id');
}
}
最新通知:
所有这些错误都出现在我创建实体的页面上。在转发到我正在做的页面之前的控制器中:
$position = new \Position();
然后,例如,以下代码也会产生错误:
dd(($position->getAttribute('is_active')));
但如果我用
替换$position = new \Position();
$position = \Position::first();
错误消失了?
这里发生了什么?????
答案 0 :(得分:1)
Laravel在幕后做了很多魔术,就像在,调用很多php magic methods。
如果未定义被调用属性,则调用__call,在Eloquent中调用getAttribute()。
getAttribute($key)
采取的步骤是
抛出异常的唯一时间是第3步。
当你创建一个新实例时,eloquent不知道它有什么样的字段,所以如果你有一个同名的方法,它总会抛出一个关系错误,这似乎是Laravel4和Laravel5。
如何避免?使用getAttributeValue($key)
方法。它没有关系检查,默认返回 null 。
或者,您也可以为您的字段添加get mutator。
答案 1 :(得分:0)
我找到了一个黑客。仍然不理想,但至少我有一些解决方案。没有比这更好的了。
所以这段代码会产生问题:
$position = new \Position();
if($position->is_active){
//
}
并且这个工作正常,这是解决方案甚至hacky但解决方案:
$position = new \Position(['is_active' => 0]);
if($position->is_active){
//
}
如果有人提供更好,更清洁的解决方案,我会等待。如果未来几天没有人进来,我会接受我的。