使用Laravel Query Builder返回Undefined属性:stdClass错误

时间:2016-12-24 01:21:48

标签: php laravel-5.2

我有一个在使用laravel eloquent方法之前有效的查询

$products = Product::where('category', 'ILIKE', '%'.$conditionTxt.'%')
                            ->orderBy('created_at', 'desc')
                            ->get();

但是在使用查询构建器方法之后

$products = DB::table('products')
                      ->where('category', 'ILIKE', '%'.$conditionTxt.'%')
                      ->orderBy('created_at', 'desc')
                      ->get();

它返回此错误:

  

未定义的属性:stdClass :: $ inventory

这是我的模型和视图的一部分,它指出错误。

模型

public function inventory(){
    return $this->hasMany('App\InventoryRecord\InventoryRecord');
}

查看:

<td>
    <?php 
    for($i = 0; $i < count($val->inventory); $i++){
        if( $val->inventory[$i]->total_qty <= 50 )  { ?>
            <span style="color:#C00"><?php echo $val->inventory[$i]->total_qty.' -'; ?></span>
        <?php  }else{ ?>
            <span style="color:#25A602"><?php echo $val->inventory[$i]->total_qty.' -'; ?></span>
        <?php
        }
    }
    ?>
</td>

2 个答案:

答案 0 :(得分:1)

使用查询构建器方法时,它返回一个Illuminate\Support\Collection,其中包含结果,其中每个结果都是 PHP StdClass对象的实例(不是模型对象)。您可以通过访问列作为对象的属性来访问每个列的值。

但是你无法访问Model关系,因为你有PHP StdClass对象。

我建议你,坚持Laravel eloquent

答案 1 :(得分:1)

您正在混合两种不同的功能。 Laravel提供了一个数据访问层,即查询生成器。 Laravel还提供了一个名为Eloquent的ORM,它建立在Query Builder之上。

当您使用Eloquent查询数据库时,您将获得您的Eloquent Models的实例。

当您使用查询构建器查询数据库时,您将获得stdClass的实例。

查询构建器不会,也不应该知道有关您的Eloquent模型的任何信息。如果您需要Eloquent功能(例如访问inventory关系),那么您需要使用Eloquent来查询数据库。