Laravel Query Builder结果对象抛出“试图获取非对象的属性”异常

时间:2016-05-16 15:39:09

标签: php laravel-4 query-builder

这是那些错误信息与手头证据直接相矛盾的头脑风暴者之一。我在名为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抛出Exceptions进行了一些快速而肮脏的调查,并确定了以下内容:

  • 对于我正在与之合作的家庭,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()调用成功解析的表达式抛出异常?当我的代码开始变得可爱时,我不喜欢它......

1 个答案:

答案 0 :(得分:1)

当DB :: Select回绕PDO并使用fetchMode属性在对象或数组之间进行选择时,您需要确保在执行之前正确设置fetchMode Connection查询。

Laravel setFetchMode实现方法var data = []; ,它设置默认连接模式。对于脚本执行的所有剩余部分,此更改将持续存在,因此如果您将其更改为某个位置,则需要记住将其更改回其余代码所期望的内容。