代码之家  ›  专栏  ›  技术社区  ›  liamstuff

在流畅的查询中使用Laravel Collection方法(first、paginate等)

  •  0
  • liamstuff  · 技术社区  · 10 年前

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

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

    根据需要提供各种位置和连接。这一切都很好,但当我使用除get以外的Elquent方法时,我会得到以下错误:

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

    这似乎与返回到新集合的内容的实际结构有关-get()或take()返回一个对象数组,这很好,而first()似乎只是返回一个单独的对象,因此出现了集合中的错误。Paginate()显然返回了一个Paginator对象,新的Collection对此也很生气。

    我不想删除Collection包装器,因为这样我就无法对结果使用其他Collection方法(我不希望在查询本身中使用lists()之类的方法,因为我在视图中以不同的方式使用相同的集合查询结果,所以我试着保持它的灵活性,并希望保持查询的数量较低)

    也许我想在这里吃蛋糕,但如果没有,任何帮助都很感激!

    干杯

    1 回复  |  直到 10 年前
        1
  •  1
  •   Joseph Silber    10 年前

    实际上,您可以使用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用户模型的Eloquet集合。


    如果您只获得一个项目,请使用以下选项:

    $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 现在是一个普通的Elquent用户模型。