这是错误消息与现有证据直接矛盾的情况之一。我在一个名为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;
}
直到今天早些时候,这段代码一直运行良好,但现在抛出了一个尝试在
处获取非对象的属性的异常$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]))
返回1
那么,为什么我会得到$names[0]
是非对象的异常呢?对于可以通过print_r()
调用成功解决的表达式,为什么会引发异常?我不喜欢我的代码开始变得可爱。。。
由于DB::Select包装在PDO
周围,并利用fetchMode
属性在对象或数组之间进行选择,因此在执行查询之前,需要确保正确设置了fetchMode
。
Laravel Connection
实现了设置默认连接模式的方法setFetchMode
。这种更改将持续到脚本执行的所有剩余部分,因此如果您在某个地方更改它,则需要记住将其更改回代码的其余部分所期望的状态。