php - Laravel 5.0 中通过关系访问属性

标签 php laravel eloquent laravel-5

我在 Grandparent -> Parent -> Child 关系中设置了多个模型,其中每个模型与其下的模型都具有一对多关系。后端是通过使用默认的 created_atmodified_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/

相关文章:

Laravel - 有效地限制每个子项目

php - 如何在 laravel Eloquent 中按相关表的列排序?

php - Silex 和 Doctrine mysql : how to return results from select all

php - 在 php 中 explode

php - 无法删除索引 '***' : needed in a foreign key constraint

php - Laravel Carbon 返回错误的时间

PHP 和 MySQL 时区,同时支持用户定义的时区

sql-server - 如何强制迁移创建 datetime2 字段而不是 datetime

php - Laravel Gmail : Expected response code 250 but got code "535",,消息为“535-5.7.8 用户名和密码未被接受。在 535 5.7.8 了解更多信息

php - 如何使用 Eloquent 方式获得行位置