我在Grandparent -> Parent -> Child
关系中设置了几个模型,每个模型与下面的模型之间存在一对多的关系。后端是使用默认的created_at
和modified_at
日期通过迁移设置的,相关的是我正在尝试抓取的记录。
我目前有(更换名称):
$parent->child->where('created_at', '=', $date);
通过回显它,我可以在运行where函数时验证$date
是否正确,并匹配数据库中的记录。我基于文档的期望是这应该返回一个集合。但是,当我尝试迭代它以获取模型的每个实例时,我会收到错误,说我正在尝试访问非对象的属性。 (只是试图回应created_at
日期)。
我还尝试将->first()
放在原始版本之后,假设它会将第一个子对象作为一个对象吐出,与那些先决条件相匹配,但是尽管集合没有显示为null,但它仍然是null经过类似的测试。
我的问题是,有没有办法让first()
方法工作,返回模型的单个实例?类似于:
$parent->child->where('created_at', '=', $date)->first();
这是我第一次发帖提问,如果您需要更多信息请问。
答案 0 :(得分:3)
您遇到的问题是由于以下原因造成的:
$parent->child;
和
$parent->child();
前者($parent->child
)是所有子对象的集合,而后者($parent->child()
)是子对象的关系查询。
你遇到的鬼鬼祟祟的问题是它们都支持where()
方法,但它们的参数有点不同。您正在使用的参数适用于关系查询的where()
方法,但它们对于Collection上的where()
方法不正确,这就是您正在使用的方法。
您需要切换到使用关系查询,或更改参数以使用集合上的where()
:
$children = $parent->child->where('created_at', $date);
// or
$children = $parent->child()->where('created_at', '=', $date)->get();
注意:Collection上的where()
方法将根据字段名称('created_at')等于(==或===)到$ date值来过滤集合。第三个参数将控制严格性(默认为严格(===),或者使用false
表示宽松(==))。
答案 1 :(得分:1)
$parent->child
将处理后的查询作为集合返回。要使用where
语句添加到查询中,您需要使用child
方法(返回查询对象),而不是子属性:
$parent->child()->where('created_at', '=', $date)->first();