通过Laravel 5.0中的关系访问属性

时间:2015-05-06 21:07:04

标签: php laravel eloquent laravel-5

我在Grandparent -> Parent -> Child关系中设置了几个模型,每个模型与下面的模型之间存在一对多的关系。后端是使用默认的created_atmodified_at日期通过迁移设置的,相关的是我正在尝试抓取的记录。

我目前有(更换名称):

$parent->child->where('created_at', '=', $date);

通过回显它,我可以在运行where函数时验证$date是否正确,并匹配数据库中的记录。我基于文档的期望是这应该返回一个集合。但是,当我尝试迭代它以获取模型的每个实例时,我会收到错误,说我正在尝试访问非对象的属性。 (只是试图回应created_at日期)。

我还尝试将->first()放在原始版本之后,假设它会将第一个子对象作为一个对象吐出,与那些先决条件相匹配,但是尽管集合没有显示为null,但它仍然是null经过类似的测试。

我的问题是,有没有办法让first()方法工作,返回模型的单个实例?类似于:

$parent->child->where('created_at', '=', $date)->first();

这是我第一次发帖提问,如果您需要更多信息请问。

2 个答案:

答案 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();