如何改进查询以避免“PHP致命错误:允许的内存大小”(laravel 5.2中的排序和分页)

如何改进查询以避免“PHP致命错误:允许的内存大小”(laravel 5.2中的排序和分页),php,mysql,laravel-5.2,query-performance,laravel-paginate,Php,Mysql,Laravel 5.2,Query Performance,Laravel Paginate,我有一些叫做海报的东西,上面有日志。我想在这些日志创建日期之前订购这些海报 我有一个名为Poster的模型,代码如下: class Poster extends Model { protected $table = 'posters'; public function pos_log_resumenEnviado() { return $this->hasMany('App\models\PosterLog', 'pos_id')->where('log', 'Autor

我有一些叫做海报的东西,上面有日志。我想在这些日志创建日期之前订购这些海报

我有一个名为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排除不需要的条目,然后在回调中使用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();

我看你是在用PHP对结果排序,为什么不使用MYSQL呢?因为我不知道如何使用MYSQL按此字段排序。我不使用Laravel,但你应该阅读文档,用MYSQL执行排序。这将更快,避免php内存限制错误。谢谢@Mcsky。我知道如何在mysql中使用orderBy,但我不知道如何在这个特定字段中使用它,因为它来自一个模型关系。不管怎样,我甚至在反排序开始执行之前就出现了错误。最好使用雄辩的排序,而不是使用php!将引发性能问题,请检查下面的答案,但如何将日志创建日期放入orderBy中?这不是poster表的一列。当您在回调中时,您可以直接访问pos_log_resumenEnviado,只需将orderBy'created_at'、'ASC';非常感谢。现在我可以使用paginate并避免php内存错误。不幸的是,现在物品的顺序不正确。如果你检查每张海报的pos_log_resumenEnviado,它们的顺序正确吗?我意识到问题是$q->orderBy'created_at','ASC';是按海报的“创建位置”订购,而不是按日志的“创建位置”订购