Laravel 查询生成器结果对象抛出 "Trying to get property of non-object" 异常
Laravel Query Builder result object is throwing "Trying to get property of non-object" exception
这是一个令人头疼的问题,其中错误信息与手头的证据直接矛盾。我在名为 Family
的 Laravel 模型中有以下方法,它有一个 id
字段:
public function getFamilyName()
{
$search_id = ( empty( $this->primary_id ) ) ? $this->id : $this->primary_id;
$names = DB::select(
'SELECT GROUP_CONCAT(`last_name` ORDER BY `last_name` SEPARATOR \'/\' ) `name_list`
FROM (SELECT `last_name`
FROM `children`
WHERE `primary_id` IS NULL
AND `family_id`=?
UNION
SELECT `last_name`
FROM `parents`
WHERE `primary_id` IS NULL
AND `family_id`=?) `last_names`',
array($search_id, $search_id) );
$nameList = $names[0]->name_list;
return ($nameList=="") ? 'Unnamed': $nameList;
}
此代码在今天早些时候之前运行良好,但现在抛出 Trying to get 属性 of non-object exception at
$nameList = $names[0]->name_list
。
我没有接触过这个方法,所以我不知道哪里出了问题。我使用 print_r 通过抛出的异常进行了一些快速而肮脏的调查,并确定了以下内容:
- 对于与我一起工作的家庭,
print_r($names)
决定
Array ( [0] => stdClass Object ( [name_list] => Esper-Smith/Smith ) )
print_r($names[0])
解析为
stdClass Object ( [name_list] => Esper-Smith/Smith )
print_r($names[0]->name_list)
解析为 'Esper-Smith/Smith'
print_r(is_object($names[0]))
returns 1
那么,为什么我会收到 $names[0]
不是对象的异常?为什么对于可以通过 print_r()
调用成功解决的表达式抛出异常?我不喜欢我的代码开始变得可爱...
由于 DB::Select 环绕 PDO
并使用 fetchMode
属性 在对象或数组之间进行选择,您需要确保您的 fetchMode
在执行查询之前已正确设置。
Laravel Connection
实现方法 setFetchMode
设置默认连接模式。此更改将在脚本执行的所有其余部分持续存在,因此如果您在某个地方更改它,您需要记住将其更改回您的代码的其余部分所期望的样子。
这是一个令人头疼的问题,其中错误信息与手头的证据直接矛盾。我在名为 Family
的 Laravel 模型中有以下方法,它有一个 id
字段:
public function getFamilyName()
{
$search_id = ( empty( $this->primary_id ) ) ? $this->id : $this->primary_id;
$names = DB::select(
'SELECT GROUP_CONCAT(`last_name` ORDER BY `last_name` SEPARATOR \'/\' ) `name_list`
FROM (SELECT `last_name`
FROM `children`
WHERE `primary_id` IS NULL
AND `family_id`=?
UNION
SELECT `last_name`
FROM `parents`
WHERE `primary_id` IS NULL
AND `family_id`=?) `last_names`',
array($search_id, $search_id) );
$nameList = $names[0]->name_list;
return ($nameList=="") ? 'Unnamed': $nameList;
}
此代码在今天早些时候之前运行良好,但现在抛出 Trying to get 属性 of non-object exception at
$nameList = $names[0]->name_list
。
我没有接触过这个方法,所以我不知道哪里出了问题。我使用 print_r 通过抛出的异常进行了一些快速而肮脏的调查,并确定了以下内容:
- 对于与我一起工作的家庭,
print_r($names)
决定
Array ( [0] => stdClass Object ( [name_list] => Esper-Smith/Smith ) )
print_r($names[0])
解析为
stdClass Object ( [name_list] => Esper-Smith/Smith )
print_r($names[0]->name_list)
解析为'Esper-Smith/Smith'
print_r(is_object($names[0]))
returns 1
那么,为什么我会收到 $names[0]
不是对象的异常?为什么对于可以通过 print_r()
调用成功解决的表达式抛出异常?我不喜欢我的代码开始变得可爱...
由于 DB::Select 环绕 PDO
并使用 fetchMode
属性 在对象或数组之间进行选择,您需要确保您的 fetchMode
在执行查询之前已正确设置。
Laravel Connection
实现方法 setFetchMode
设置默认连接模式。此更改将在脚本执行的所有其余部分持续存在,因此如果您在某个地方更改它,您需要记住将其更改回您的代码的其余部分所期望的样子。