2017-08-30 23 views
0

我有几个称为海报的项目有日志。我想在创建这些日志的日期前订购海报。我该如何改进我的查询,以获得“PHP致命错误:允许的内存大小”(在laravel 5.2中订购和分页)

我有一个名为海报与此代码模式:

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()方法,但我不知道是否有另一种方式为了这个命令。

+1

我看来,要排序你用PHP的结果,你为什么不使用MYSQL呢? – Mcsky

+0

因为我不知道如何使用MYSQL来排序这个字段。 –

+0

我不使用Laravel,但应阅读文档以通过mysql执行命令。这会更快,并避免php内存限制错误。 – Mcsky

回答

1

这里是你必须使用 首先正确的查询,使用其中首先要排除不必要的条目,然后里面有回调可以使用雄辩的筛选结果:

$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

但是,我怎么能把日志创建日期里面orderBy?这不是海报表的一列。 –

+0

当你在回调中时,你可以直接访问pos_log_resumenEnviado,只需要把orderBy('created_at','ASC'); – Sletheren

+0

非常感谢。现在我可以使用paginate()并避免php内存错误。不幸的是,现在的项目顺序是不正确的。 –

相关问题