Model::all() 在 Laravel 中不起作用 - 其他查询可以

Model::all() Does not work in Laravel - other queries do

我是 Laravel 的新手,我继承了一个需要在不同服务器上运行的项目。需要明确的是,我没有编写此应用程序,也不是 Laravel 专家。

话虽如此,该应用程序看起来确实编写得相当扎实,我对该框架印象深刻。我使用的最后一个 PHP 框架是 Cake,它看起来像是旧版本 Rails 的笨重克隆,这看起来好多了 - 但我离题了。

无论如何。其中一个视图一直在新服务器上呈现空白页面。我一行一行地注释掉代码,直到我再次开始工作。罪魁祸首是这一行:

$leads = Lead::all()->count();

当我将其注释掉并用页面加载的整数替换 prospects 变量时。

我改用这个解决了这个问题:

DB::table('leads')->count()

现在可以正常使用了。

我仍然感到困惑,但是为什么这可以在旧服务器上运行(顺便说一句,老服务器要新得多)而不是这个。

我没有旧服务器的确切规格,但我将其移动到的服务器是 ubuntu 框 运行 php 5.4.12

MySQL 是外部托管的,网站的两个实例都连接到它。

Lead 模型如下所示:

    <?php

    class Lead extends Eloquent {

        protected $guarded = array();


        public function results()
        {
            return $this->hasMany('Result');
        }

        public function items()
        {
            return $this->hasMany('Item');
        }

    }

?>

重复我展示的 ::all() 代码在另一个服务器实例上运行时没有错误,只是在较新的设置上没有。

谢谢!

我会缩小问题范围并返回更多信息——即第一步是定义您所说的不工作是什么意思。

$leads = Lead::all()->count() 实际上 return 是一个值吗,但正是这个值导致应用程序的另一部分中断?或者是 $leads = Lead::all()->count() 的调用破坏了东西?

您对错误的描述

One of the views kept rendering a blank page on the new server

这听起来像是 PHP 错误。因为 Laravel 应该抛出它自己的错误(要么是一个通用错误页面,要么是一个 Whoops 错误,如果调试模式打开),听起来你正在处理那种问题 Laravel 的错误处理程序无法捕获。

您需要正确设置 PHP 错误日志记录。 PHP 通常记录到自定义错误文件或 apache/web-server 日志。这可能是出了名的难以设置——我会从一个带有明显错误的独立 PHP 页面开始

<?php
//no ending ; to create a parse error
$test = 1+1

并使用它来找出 how/where 一般 PHP 错误被记录。完成此操作后,您将能够在调用时具体查看崩溃的原因 PHP/Laravel。此外,在你的代码行前面放一个 ini_set('display_errors', 1); 有时足以让 PHP 向浏览器吐出错误。

综上所述,在Lead::all()->count()中对all的调用实际上会加载整个集合对象(耗内存),然后对其进行计数。对 DB::table('leads')->count() 的调用应该使用简单的 SQL count(*)。那,加上 PHP 错误(相对于 Laravel)会让我指向你的 PHP memory_limit 在新服务器上较低,and/or 旧版本PHP 对象处理效率较低,消耗更多内存。

嗯,这取决于你使用的 laravel 版本,如果是新版本,5.0,

$leads= User::where('votes', '>', 100)->get();

$count = $leads->count();

像这样的东西肯定有用。