在流畅的查询上使用Laravel Collection方法(首先是paginate等)

时间:2014-08-04 21:32:42

标签: laravel pagination fluent

我目前正在使用Laravel的流畅查询从MSSQL DB中获取数据。为了继续使用Eloquent的方法(列表,排序,过滤等),我将流畅的查询包装在一个新的集合中:

return new Collection( DB::table('tblCustomerUsers')
            ->select('ContractID','ContractNum','ContractName')         
            ->where('CustomerUserID',Auth::User()->CustomerUserID)
            ->where('Restricted','0')

            ->orderBy('ContractTypeID','ASC')

            ->get()
        );  

根据需要使用各种轮和连接。这一切都很精彩,但是只要我使用除了获取之外的Eloquent方法,我会收到以下错误:

Argument 1 passed to Illuminate\\Support\\Collection::__construct() must be of the type         array, object given

这似乎与返回到新集合的实际结构有关 - get()或take()返回一个对象数组,这很好,而它似乎是第一个()例如,只返回一个对象,因此来自Collection的错误。 Paginate()显然会返回一个Paginator对象,新的Collection也会发脾气。

我不想删除Collection包装器,因为我失去了对结果使用其他Collection方法的能力(我不想在查询本身中使用像lists()这样的方法因为我在视图中以不同的方式使用相同的设置查询结果,所以我试图保持其灵活性,并希望保持较低的查询数量。

也许我想尝试蛋糕并在这里吃,但如果没有,任何帮助都会受到赞赏!

干杯!

1 个答案:

答案 0 :(得分:1)

你实际上可以使用Eloquent:

$users = DB::table('tblCustomerUsers')
            ->select('ContractID', 'ContractNum', 'ContractName')         
            ->where('CustomerUserID', Auth::User()->CustomerUserID)
            ->where('Restricted', '0')
            ->orderBy('ContractTypeID', 'ASC')
            ->get();

$users = User::hydrate($users);

$users现在将成为Eloquent用户模型的雄辩集合。


如果您只获得一件商品,请使用:

$user = DB::table('tblCustomerUsers')
            ->select('ContractID', 'ContractNum', 'ContractName')         
            ->where('CustomerUserID', Auth::User()->CustomerUserID)
            ->where('Restricted', '0')
            ->orderBy('ContractTypeID', 'ASC')
            ->first();

$user = (new User)->newFromBuilder($user);

$user现在是一个常规的Eloquent用户模型。