Laravel 4.1: Come impaginare eloquente desideroso rapporto?

C’era la domanda sul vecchio L3 desideroso caricato schemi, non utilizzando eloquente. Ma voglio usare eloquente per ottenere ansioso caricato rapporto con la paginazione.

Principale modello: Argomento che ha relazione uno a molti con Post,
In modo che uno Argomento ha molti Post. Ho tutti i dati per questa funzione:

public function findById($id)
{
    return $this->topic->with('posts', 'posts.user', 'posts.user.profile')
                       ->find($id);
}

E poi faccio il ciclo per visualizzare tutti i risultati, ma non sono impaginato:

@foreach($topic->posts as $post)
... unpaginated content ...
@endforeach

Quindi, potrei fare una soluzione e selezionare separatamente tutti i post che ha $id di argomento e uso ->impaginazione() invece di ->get() e avrebbe avuto impaginato $pentole,

  1. ma c’è la possibilità di utilizzare desideroso caricato rapporto post che è impaginato ? E come può essere fatto ?
InformationsquelleAutor user991 | 2014-01-03

 

2 Replies
  1. 32

    Per chiarire una cosa: l’impaginazione desideroso caricato rapporti è un po ‘ un idea sbagliata. Il punto di caricamento immediato è quello di recuperare tutti i rapporti in query con il minor numero possibile. Se si desidera recuperare i 10 argomenti, che dispone di 35 posti, si avrà solo bisogno di due query. Dolce!

    Che ha detto, l’impaginazione di una viaggiatrice-caricato rapporto non è andare a lavorare. In considerazione due scenari in cui desideroso di caricamento succede:

    1. Che si desidera recuperare e argomenti, e magari elenco i primi cinque post per ogni argomento. Grande! Desideroso di caricamento è perfetto. Ora, non si vuole impaginare il desiderosi caricato post su una pagina come questa, in modo che non importa.

    2. Si carica di un singolo argomento, e vuoi impaginare i post per argomento. Grande! Relativamente facile da fare. Tuttavia, se hai già desideroso caricato tutti post appartenenti a questo argomento, hai appena potenzialmente recuperato un sacco di risorse aggiuntive che non è necessario. Quindi desideroso di caricamento è in realtà male voi.

    Che ha detto, ci sono due possibili soluzioni:

    Opzione 1: Creare un custom funzione di accesso che impagina l’Eloquente relazione.

    /**
     * Paginated posts accessor. Access via $topic->posts_paginated
     * 
     * @return \Illuminate\Pagination\Paginator
     */
    public function getPostsPaginatedAttribute()
    {
        return $this->posts()->paginate(10);
    }

    Pro: Impagina molto facilmente; non interferire con le normali post rapporto.

    Contro: Desideroso di caricamento post non influenzerà la funzione di accesso; l’esecuzione di creare due query aggiuntive sulla parte superiore del desiderosi caricato query.

    Opzione 2: Impaginare i post Raccolta restituito dal desideroso caricato rapporto.

    /**
     * Paginated posts accessor. Access via $topic->posts_paginated
     * 
     * @return \Illuminate\Pagination\Paginator
     */
    public function getPostsPaginatedAttribute()
    {
        $posts = $this->posts;
    
        //Note that you will need to slice the correct array elements yourself.
        //The paginator class will not do that for you.
    
        return \Paginator::make($posts, $posts->count(), 10);
    }

    Pro: Utilizza il desiderosi caricato rapporto; non crea query aggiuntive.

    Contro: Deve recuperare TUTTI gli elementi, a prescindere della pagina corrente (lento); necessario per costruire la corrente-elementi di pagina manualmente.

    • Grazie per l’ottima spiegazione, Opzione 1 è la scelta giusta per me, ora. Mi chiedevano desideroso di carico, perché il pensiero che è l’unico modo per accedere a posti attraverso $argomento, ma l’Opzione 1 fa bene e fa anche la paginazione e che è esattamente quello che voglio. Si $tema->posts_paginated->link() questo lavoro per la generazione di collegamenti ?
    • Sì, verrà restituito un Paginator oggetto, proprio come un normale ->paginate(10) alla fine di una Eloquente query.
    • Il problema è che se ho 1000 commenti sul database e ho selezionato, anche se l’attributo impaginare correttamente le prestazioni vanno giù. Quindi c’è qualche metodo per limite di 10 post per ogni Argomento direttamente sul Eloquente query?
    • Cosa succede se voglio caricare argomenti, e l’elenco di tutti i post per l’argomento, ma solo mostrare 10 argomenti contemporaneamente. Suona come voglio Argomento::con(‘post’)->impaginazione(10), che è un caso di utilizzo sembrano aver perso.
    • Che è esattamente quello che vuoi, ma non è la stessa cosa come l’impaginazione del ansioso-caricato rapporto. Usando il tuo esempio, questo argomento si concentra su l’impaginazione del posts rapporto, non originale argomenti.
    • Fantastica risposta

  2. 4

    Si potrebbe desiderare di dare un’occhiata al seguente:

    $category = 'Laravel';
    
    $posts = Post::with('user', 'category')->whereHas('category', function($query) use ($category) {
    $query->where('name', '=', $category);
    })->paginate();

    Da Zenry :
    Fonte:http://laravel.io/forum/02-25-2014-eager-loading-with-constrains-load-post-based-on-category-name

    Spero che questo aiuta

    • Assolutamente, questo ha funzionato molto meglio per me. Invece di cercare di impaginare il desiderosi caricato rapporto, pensare all’indietro. Che modo semplice per afferrare tutti i post ‘whereHas’ l’argomento, e impaginare oltre che.

Lascia un commento