Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.7,雄辩:此集合实例上不存在属性[X],存在多对多关系_Php_Laravel_Eloquent_Relationship - Fatal编程技术网

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

Php Laravel 5.7,雄辩:此集合实例上不存在属性[X],存在多对多关系,php,laravel,eloquent,relationship,Php,Laravel,Eloquent,Relationship,我得到了这两个表(Estado(Status)和Proyecto(Proyect)),这两个表之间有一个称为EstadoProyecto(statusProyect)的透视表,我试图只访问id_Status(id_Estado)字段中有2个或3个且日期最近的项目。它在使用find(使用2或3)时起作用,但它给出了错误。尝试将数组发送到find方法或使用get方法时,“雄辩:此集合实例上不存在属性[proyectos],多对多关系”。当我不使用只有一个值的find方法时,它会给我同样的错误。 这是

我得到了这两个表(Estado(Status)和Proyecto(Proyect)),这两个表之间有一个称为EstadoProyecto(statusProyect)的透视表,我试图只访问id_Status(id_Estado)字段中有2个或3个且日期最近的项目。它在使用find(使用2或3)时起作用,但它给出了错误。尝试将数组发送到find方法或使用get方法时,“雄辩:此集合实例上不存在属性[proyectos],多对多关系”。当我不使用只有一个值的find方法时,它会给我同样的错误。 这是我的模型和我试图使用的查询。

这是目前有效的查询: 提前谢谢。
Diego:)

您的查询正在返回一个集合,因为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
并返回集合,您可以在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;
如果你只想得到一个结果,那么使用Elounce的
first
方法通常是最好的选择

我希望这有帮助

额外信息:

Eloquent中的
find
方法可以接受单个值或值数组作为参数,如果没有向其传递值或向其传递值数组,则可以返回集合而不是单个模型的实例


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

欢迎使用StackOverflow。如果您向
find
发送多个“id”,它将返回一个集合,
get
始终返回一个集合。。。集合不是模型。。。您需要一个
Estado
model实例才能访问其
proyectos
关系。。另一个查询之所以有效,是因为它返回一个模型实例或null,而不是集合,因为您只想得到1Hi,非常感谢,第一个方法工作得非常好。不幸的是,第二个方法返回一个错误sayind,find需要至少一个参数idk,如果它可能是Laravel thah im使用的版本。错误:“函数Illumb\Database\Eloquent\Builder::find()的参数太少,0在第56行的C:\xampp\htdocs\SIGECOP\app\Http\Controllers\ReportesController.php中传递,预期至少1个”没问题,我已更新了答案。
find
方法需要一个参数,这是正确的。
get
方法是返回集合的替代方法,可以在不提供任何参数的情况下使用。第一个方法有一个问题,我想我需要在where()方法之前使用第一个()方法,因为它会给我旧注册表的结果。例如,我获得了proyect#1,状态为1 date 12/10/19,然后我得到了状态为2的项目1,日期为19年10月13日,之后我得到了状态为114年10月19日的项目1。输出应该是0 proyects,但它会返回状态为2的2注册表。如果实际有一列要按其进行筛选,则只需添加
where
方法。我将用另一个例子更新我的答案。