Laravel Query Builder结果对象正在抛出“;尝试获取非对象“”的属性;例外


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;
}   

直到今天早些时候,这段代码一直运行良好,但现在抛出了一个尝试在
处获取非对象
的属性的异常$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。这种更改将持续到脚本执行的所有剩余部分,因此如果您在某个地方更改它,则需要记住将其更改回代码的其余部分所期望的状态。