Laravel 5.7, Eloquent: 属性 [X] 在此集合实例上不存在,多对多关系

Laravel 5.7, Eloquent: Property [X] does not exist on this collection instance, Many to Many Relationship

我得到了这两个 tables(Estado(Status)和 Proyecto(Proyect)),它们之间有一个名为 EstadoProyecto(statusProyect)的枢轴 table,我正在尝试访问只有在 id_status(id_estado) 字段中有 2 或 3,并且具有最新日期的项目。它在使用 find(使用 2 或 3)时有效,但它给了我错误。 “ Eloquent: 属性 [proyectos] 在这个集合实例上不存在,多对多关系”试图将数组发送到 find 方法或使用 get 方法时。当我不使用只有一个值的 find 方法时,它给了我同样的错误。 这是我的模型,以及我正在尝试使用的查询。 model1 model2model3

这是目前有效的查询: query 提前致谢。 迭戈 :)

您的查询是 return 集合,因为您的模型可能有多个条目 return 通过 Eloquent 提供的 find 方法编辑,因此您可以像这样使用 first 方法:

$estados = Estado::whereHas('proyectos', function ($query) {
    $query->whereIn('id_estado', [2, 3])
        ->orderBy('fecha_estado', 'DESC');
})
    ->with('proyectos', function ($query) {
        $query->whereIn('id_estado', [2, 3])
            ->orderBy('fecha_estado', 'DESC');
    })
    ->first();

使用上面的代码片段,要获得符合这些条件的多个结果,您只需将 first 方法替换为 get

上面的代码为您提供了单个 Estado 模型的实例。

否则,如果您打算使用原始方法中的某些东西,您可以使用 get 和 return 一个集合,您可以在 foreach 循环中迭代它们:

$estados = Estado::whereHas('proyectos', function ($query) {
    $query->orderBy('fecha_estado', 'DESC');
})
    ->with('proyectos')
    ->get();

foreach ($estados as $estado) {
    $estado->proyectos->id;
}

或者您可以像访问数组一样访问集合中的项目,前提是您知道结果中肯定有所需的条目:

$estados[0]->proyectos->id;

如果您只想获得一个结果,使用 Eloquent 的 first 方法通常是最好的选择。

希望对您有所帮助!

额外信息:

Eloquent 中的 find 方法可以接受单个值或值数组作为参数,并且在没有值传递给它或值数组被传递的情况下传递给它时,可以 return 编辑集合而不是单个模型的实例。

另一方面,get 方法可以在不提供任何参数的情况下使用,并且每次都会 return 收集(尽管如果底层查询没有产生任何结果,这些方法仍然不能保存任何项目)