Laravel Eloquent返回具有空属性的双精度数组 首先第二,第三,

问题描述

我正在使用Laravel Eloquent查询模型。当有可用记录时,查询将返回一个对象数组的结果。

[{id: 2,num: 3}]

如果没有可用的记录,Eloquent将在对象数组中返回一个数组,其中所有对象属性都为空值。

[[{id: null,num: null}]]

问题是如何测试是否没有记录或空对象。以下方法均无效:

isset($records) // does not cover empty object
!empty($records) // does not seem to see null properties
count($records) > 0 // sees an array more than zero deep

这是我的查询

$records = FertilAppUser::select('fertilapp.*')
            ->leftJoin('fertilapp','fertilappuser.id','=','fertilapp.fertilappuser_id')
            ->where('fertilappuser.id',$request->get( 'id' ))
            ->groupBy('fertilapp.id')
            ->orderBy('fertilapp.id','asc')
            ->get();

必须处理一个空结果,因为这是可能的,这似乎是一件让我感到痛苦的事情。一切正常,然后我测试空结果,并且繁荣出现错误

有人可以帮助我理解为什么结果是不同深度的数组吗?

如果两者都导致在一个对象数组的位置很容易,但是如何检查!empty($record[0]->id)!empty($record[0][0]->id)却没有错误

有趣的是,以下查询返回对象数组或具有空[null]的数组。

$records = DB::select('SELECT fertilapp.* ' .
                  ' FROM fertilapp ' .
                  ' LEFT JOIN fertilappuser ON fertilappuser.id = fertilapp.fertilappuser_id ' .
                  ' WHERE fertilappuser.id = ? ' .
                  ' GROUP BY fertilapp.id ' .
                  ' ORDER BY fertilapp.id ASC ',[$request->get( 'id' )]);

可以使用以上方法进行测试。仍然想知道为什么Eloquent方法返回上面的结果。

运行查询后,我检查结果是否可用并遍历它们。

if (isset($records) && !empty($records) ) {                        
       foreach ($records as $key => $value) {...}
}

解决方法

首先

isset($record)将始终返回true,因为您自己设置了$record变量。

第二,

您应该使用!empty($record)!$record->isEmpty()而不是$record->isNotEmpty()

第三,

您遇到的null值可能是left join的结果。如果要避免使用(inner) join值,请使用null

,

您在此处使用左联接- fertilappusers 左联接fertilapp 即使他们在fertilapp表中没有记录,它也会返回所有用户记录。

您提供的查询是不同的。第一个就像我上面说的。 第二个是fertilapp左联接fertilappusers,即使没有用户,它也会为您提供fertilapp的所有记录。

请检查此链接,您将在这里熟悉mysql连接的工作方式 What's the difference between INNER JOIN,LEFT JOIN,RIGHT JOIN and FULL JOIN?