我在 Grandparent -> Parent -> Child
关系中设置了多个模型,其中每个模型与其下的模型都具有一对多关系。后端是通过使用默认的 created_at
和 modified_at
日期进行迁移来设置的,相关的,因为这就是我试图获取记录的日期。
我目前有(已替换名称):
$parent->child->where('created_at', '=', $date);
通过回显它,我可以验证在运行 where 函数时 $date
是否正确,并且与数据库中的记录匹配。根据文档,我的期望是这应该返回一个集合。然而,当我尝试迭代它以获取内部模型的每个实例时,我收到错误消息,指出我正在尝试访问非对象的属性。 (只是想回显 created_at
日期)。
我还尝试将 ->first()
放在原来的后面,假设它将第一个子对象吐出作为一个对象,与这些先决条件相匹配,但它结果为 null尽管在进行类似测试时集合并未显示为空。
我的问题是,有没有办法让 first()
方法发挥作用,返回模型的单个实例?类似于:
$parent->child->where('created_at', '=', $date)->first();
这是我第一次发布问题,因此如果您需要更多信息,请询问。
最佳答案
您遇到的问题是由于以下方面的差异造成的:
$parent->child;
和
$parent->child();
前者($parent->child
)是所有子对象的集合,而后者($parent->child()
)是关系查询子对象。
您遇到的偷偷摸摸的问题是,两者都支持 where()
方法,但它们的参数有点不同。您使用的参数对于关系查询上的 where()
方法可以正常工作,但对于集合上的 where()
方法则不正确,该方法就是你正在使用的。
您需要切换到使用关系查询,或者更改参数以使用集合上的 where()
:
$children = $parent->child->where('created_at', $date);
// or
$children = $parent->child()->where('created_at', '=', $date)->get();
注意:集合上的 where()
方法将根据字段名称('created_at')与 $date 值相等(== 或 ===)来过滤集合。第三个参数将控制严格性(默认为严格 (===),或使用 false
表示宽松 (==))。
关于php - Laravel 5.0 中通过关系访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087521/