当前位置: 首页 > 面试题库 >

在加载时向Laravel / Eloquent模型添加自定义属性?

狄溪叠
2023-03-14
问题内容

我希望能够在加载Laravel /
Eloquent模型时为其添加自定义属性/属性,类似于使用RedBean的
$model->open()方法可以实现的那样。

例如,目前,在我的控制器中,我有:

public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}

能够省略循环并已经设置并填充了“ available”属性将是很好的选择。

我尝试使用文档中描述的一些模型事件在对象加载时附加此属性,但到目前为止还没有成功。

笔记:

  • “可用”不是基础表中的字段。
  • $sessions是作为JSON对象作为API的一部分返回的,因此$session->available()无法在模板中调用类似内容

问题答案:

问题是由ModeltoArray()方法忽略所有与基础表中的列不直接相关的访问器而导致的。

正如泰勒·奥特威尔(Taylor
Otwell)在这里提到的:“这是故意的,并且出于性能考虑。”
但是,有一种简单的方法可以实现此目的:

class EventSession extends Eloquent {

    protected $table = 'sessions';
    protected $appends = array('availability');

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}

只要您添加了适当的访问器,$ appends属性中列出的所有属性都将自动包含在模型的数组或JSON形式中。

旧答案(适用于 <4.08的Laravel版本):

我发现的最佳解决方案是重写toArray()方法并显式设置属性:

class Book extends Eloquent {

    protected $table = 'books';

    public function toArray()
    {
        $array = parent::toArray();
        $array['upper'] = $this->upper;
        return $array;
    }

    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}

或者,如果您有很多自定义访问器,请遍历所有访问器并应用它们:

class Book extends Eloquent {

    protected $table = 'books';

    public function toArray()
    {
        $array = parent::toArray();
        foreach ($this->getMutatedAttributes() as $key)
        {
            if ( ! array_key_exists($key, $array)) {
                $array[$key] = $this->{$key};   
            }
        }
        return $array;
    }

    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}


 类似资料:
  • 我想在我雄辩的模型中推一个额外的计算属性,我想在我的边栏选项卡中使用它作为

  • 有没有可能通过使用属性在Laravel模型上延迟加载自定义属性,而不必每次都加载它?我正在寻找一种类似于你们可以懒散地加载雄辩的关系的方式。 例如,给定模型上的这个访问器方法: 我希望能够做这样的事情: 这个问题与在加载时向Laravel/Elount模型添加自定义属性不同吗?因为它希望在每次模型加载时加载一个自定义属性,所以我希望仅在指定时延迟加载该属性。 我想我可以为模型实例分配一个与自定义属

  • 一个具有“姓名”、“地址”和“工资”属性的实体“人” 两个角色-“员工”和“经理” 虽然员工应该能够编辑他自己的地址,但他肯定不能改变他的工资或其他人的地址。虽然他可能被允许看到自己的工资和其他用户的地址,但他甚至不允许看到其他人的工资,更不用说编辑了。另一方面,manager具有完全的readwrite权限。 这在后端不是问题--我们可以在那里使用自定义bean验证来强制执行写权限。 我想收到

  • 问题内容: 我有一个带有开始和结束日期范围的Django模型。我想强制执行验证,以便没有两个记录具有重叠的日期范围。最简单的实现方式是什么,这样我就不必重复编写逻辑了? 例如,我不想在Form 和 a 以及 admin表单中重新实现此逻辑, 并且 模型被重写。 据我所知,Django在全球范围内强制执行这些类型的条件并不容易。 Googling并不是很有帮助,因为“模型验证”通常是指验证特定的模型

  • 问题内容: 我已经创建了自己的NER模型与斯坦福大学“斯坦福大学NER”软件,并按照这些方向。 我知道CoreNLP按照以下顺序开箱即用地加载了三个NER模型: 我现在想将我的NER模型包括在上面的列表中,并先用NER模型标记文本。 我已经找到了关于该主题的两个以前问题,它们是“使用自定义NER模型的Stanford OpenIE[”和“为什么Stanford CoreNLP NER注释器默认加载

  • null 我发现了之前关于这个主题的两个StackOverflow问题,它们是“Stanford OpenIE使用定制的NER模型”和“为什么Stanford CoreNLP NER-annotator默认加载3个模型?” 这两个帖子都有很好的答案。答案的一般信息是,您必须在文件中编辑代码。 使用自定义NER模型的斯坦福OpenIE 是否需要修改或添加此代码到CoreNLP软件中的特定类文件中?