如何在laravel模型中访问is_ *属性?

时间:2016-07-25 08:10:58

标签: laravel-4 eloquent

我正在使用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();

错误消失了?

这里发生了什么?????

2 个答案:

答案 0 :(得分:1)

Laravel在幕后做了很多魔术,就像在,调用很多php magic methods

如果未定义被调用属性,则调用__call,在Eloquent中调用getAttribute()。 getAttribute($key)采取的步骤是

  1. 此密钥是否有数据库字段?如果是这样,请将其退回。
  2. 此密钥是否存在加载关系?如果是这样,请将其退回。
  3. 这个密钥有camelCase方法吗?如果是这样,请将其退回。 (is_active查找isActive方法)
  4. 返回null。
  5. 抛出异常的唯一时间是第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){
    //
}

如果有人提供更好,更清洁的解决方案,我会等待。如果未来几天没有人进来,我会接受我的。