2015-04-28 22 views
6

Si verificano problemi con un array restituito da DB::select(). Sto utilizzando pesantemente skip e take su Collections di modelli eloquenti nella mia API. Sfortunatamente, DB :: select restituisce un array, che ovviamente non funziona con skip e take. Come convertire gli array in una collezione che può utilizzare questi metodi?API RESTful - Array alla raccolta Laravel 5

Ho provato

\Illuminate\Support\Collection::make(DB::select(...)); 

Il che funziona non è proprio come mi aspettavo, che avvolge l'intero array in una raccolta, non i singoli risultati.

È possibile convertire il ritorno da un DB::select a una raccolta "corretta" che può utilizzare i metodi skip e take?

Aggiornamento

Ho anche provato:

$query = \Illuminate\Support\Collection::make(DB::table('survey_responses')->join('people', 'people.id', 
     '=', 'survey_responses.recipient_id')->select('survey_responses.id', 'survey_responses.response', 
     'survey_responses.score', 'people.name', 'people.email')->get()); 

Che mi dice ancora:

FatalErrorException in QueryHelper.php line 36: 
Call to a member function skip() on array 

Acclamazioni

risposta

2

Per chiunque altro che sta avendo questo tipo di problema in laravel, ho trovato un lavoro in giro con la seguente soluzione:

 $query = DB::table('survey_responses')->join('people', 'people.id', '=', 'survey_responses.recipient_id') 
      ->select('survey_responses.id', 'survey_responses.response', 'survey_responses.score', 'people.name', 'people.email'); 
      if(isset($tags)){ 
       foreach($tags as $tag){ 
        $query->orWhere('survey_responses.response', 'like', '%'.$tag.'%'); 
       } 
      }; 

     // We apply the pagination headers on the complete result set - before any limiting 
     $headers = \HeaderHelper::generatePaginationHeader($page, $query, 'response', $limit, $tags); 
     // Now limit and create 'pages' based on passed params 
     $query->offset(
      (isset($page) ? $page - 1 * (isset($limit) ? $limit : env('RESULTS_PER_PAGE', 30)) : 1) 
     ) 
     ->take(
      (isset($limit) ? $limit : env('RESULTS_PER_PAGE', 30)) 
     ); 

In sostanza, non ero consapevole del fatto che è possibile eseguire le query quasi in modo incrementale , che mi ha permesso di generare blocchi di impaginazione prima del limitando i dati restituiti.

10

vorrei provare:

$queryResult = DB::table('...')->get(); 

$collection = collect($queryResult); 

Se il risultato della query è un array, la raccolta viene riempita con i risultati. Vedi la documentazione ufficiale per la raccolta. Laravel5 Collections

+0

Grazie per il commento. Ho gestito quella parte con Collection :: make(), sfortunatamente non riesco ancora a eseguire skip() e take() contro le collezioni. – LokiSinclair

+1

Non sono sicuro di cosa intendi con skip() e take(). La dose della classe Collection non ha questi metodi. [Collezione] (http://laravel.com/api/5.0/Illuminate/Support/Collection.html) Puoi pubblicare ciò che vuoi fare con la raccolta? – ZengineChris

+0

Sì, mi dispiace, la mia comprensione della classe Collection è stata limitata. Quello che voglio fare è costruire manualmente le intestazioni di paginazione con il salto e prendere i metodi. Sfortunatamente, questi metodi sembrano essere disponibili solo nella classe Query \ Builder. Dovrò trovare un altro modo. Grazie comunque. – LokiSinclair