How can I improve my query for not to get "PHP Fatal error: Allowed memory size" (Ordering and paginating in laravel 5.2)
How can I improve my query for not to get "PHP Fatal error: Allowed memory size" (Ordering and paginating in laravel 5.2)
我有几个称为海报的项目有日志。我想在这些日志的创建日期之前订购海报。
我有一个名为 Poster 的模型,代码如下:
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();
}
然后在我的控制器中检索这样的结果:
$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);
我得到所有的海报,然后我订购它们并获得前 1200 个结果。这一直工作正常(性能缓慢)但现在我得到了我在标题中所说的 php 错误。错误甚至在 sortBy 执行之前就出现了,只是 get()
如果我不必使用 sortBy 我可以使用 paginate() 方法但我不知道是否有其他方法订购那个。
这是您必须使用的正确查询
首先,使用 where first 排除不需要的条目,然后在 with 回调中,您可以使用 eloquent 过滤结果:
$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();
我有几个称为海报的项目有日志。我想在这些日志的创建日期之前订购海报。
我有一个名为 Poster 的模型,代码如下:
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();
}
然后在我的控制器中检索这样的结果:
$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);
我得到所有的海报,然后我订购它们并获得前 1200 个结果。这一直工作正常(性能缓慢)但现在我得到了我在标题中所说的 php 错误。错误甚至在 sortBy 执行之前就出现了,只是 get()
如果我不必使用 sortBy 我可以使用 paginate() 方法但我不知道是否有其他方法订购那个。
这是您必须使用的正确查询 首先,使用 where first 排除不需要的条目,然后在 with 回调中,您可以使用 eloquent 过滤结果:
$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();