2017-08-30 3 views
0

J'ai plusieurs éléments appelés affiches qui ont des journaux. Je veux commander ces affiches par date de création de ces journaux.Comment puis-je améliorer ma requête pour ne pas obtenir "Erreur fatale PHP: taille de la mémoire autorisée" (Commande et pagination dans laravel 5.2)

J'ai un modèle Postériser avec ce code:

class Poster extends Model { 

protected $table = 'posters'; 

public function pos_log_resumenEnviado() 
{ 
    return $this->hasMany('App\models\PosterLog', 'pos_id')->where('log', 'Autores de poster enviado')->orWhere('log', 'Resumen de poster modificado')->latest(); 
} 

Puis, dans mon contrôleur je récupère des résultats comme celui-ci:

$posters = Poster::with('pos_log_resumenEnviado', 'user')->where('state', 'Resumen pendiente de aceptacion')->get(); 

$posters = $posters->sortBy(function($pos) 
{ 
    if(sizeof($pos->pos_log_resumenEnviado) > 0) 
     return $pos->pos_log_resumenEnviado[0]->created_at; 
})->take(1200); 

Je reçois toutes les affiches et je les commander et prendre la premiers 1200 résultats. Cela a fonctionné très bien (avec une exécution lente) mais maintenant je reçois l'erreur de php que j'ai dite dans le titre. Erreur vient avant même la sortBy exécution, juste avec le get()

Si je ne devais pas utiliser sortBy je pourrais utiliser paginate() méthode mais je ne sais pas s'il y a une autre façon pour commander cela.

+1

me semble que vous triez votre résultat avec PHP, pourquoi n'utilisez-vous pas MYSQL pour cela? – Mcsky

+0

Parce que je ne sais pas comment utiliser MYSQL pour commander par ce champ. –

+0

Je n'utilise pas Laravel, mais vous devriez lire la documentation pour effectuer une commande avec mysql. Ce sera plus rapide et éviter l'erreur de limite de mémoire php. – Mcsky

Répondre

1

Voici la requête correcte, vous devez utiliser d'abord, utiliser où d'abord d'exclure les entrées non désirées et à l'intérieur du avec rappel, vous pouvez filtrer les résultats en utilisant éloquent:

$posters = Poster::where('state', 'Resumen pendiente de aceptacion')->with(['pos_log_resumenEnviado' => function($q){ 
       return $q->orderBy('poster_logs.created_at','ASC'); 
      }])->with('user')->get(); 
+0

Mais comment puis-je mettre la date de création du journal dans le orderBy? Ce n'est pas une colonne de tableau d'affiche. –

+0

lorsque vous êtes dans le rappel, vous pouvez accéder directement au pos_log_resumenEnviado, il suffit de mettre orderBy ('created_at', 'ASC'); – Sletheren

+0

Merci beaucoup. Maintenant, je peux utiliser paginate() et éviter l'erreur de mémoire php. Malheureusement, l'ordre des articles n'est pas correct. –