在laravel

时间:2018-03-02 18:25:47

标签: php laravel laravel-5.5

我正在尝试从数据库获取所有帖子并在视图中显示。我想要的帖子存储在数据库中post_type = product

我收到了这个错误:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 62918656 bytes)

这是我的模特:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class GetPostModel extends Model
{
    /**
     * @param $filed
     * @param $value
     * @return mixed
     */
    static function get_posts_by_filed($filed, $value)
    {
        $result = DB::table('posts')->where($filed, $value);
        return $result;
    }
}

这就是我在Controller中所做的:

public function all_products_page(Request $request)
{

    //getting the products
    $all_products = GetPostModel::get_posts_by_filed('post_type', 'product');
    echo '<pre>';
    print_r($all_products);
    echo '</pre>';
}

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为你遗漏了get()

public function all_products_page(Request $request)
{

//getting the products
$all_products = GetPostModel::get_posts_by_filed('post_type', 'product')->get();
echo '<pre>';
print_r($all_products);
echo '</pre>';
 }

答案 1 :(得分:0)

您的数据库中似乎有太多条目,并且它们都被加载到PHP内存中。

简单的解决方案是增加PHP内存限制:

ini_set('memory_limit', '512M');

正确的解决方案是尝试保护您的内存使用并限制一次处理所有信息。另外,请记住,向浏览器发送过多信息也可能会影响客户端的性能。

可能的方法是使用分页。 Laravel已将此集成在查询构建器中: https://laravel.com/docs/5.6/pagination

如果绝对需要通过所有帖子,您可能需要按照Eloquent文档中的说明对结果进行分块:https://laravel.com/docs/5.6/eloquent#chunking-results

此外,更像 Laravel 的方法看起来像这样:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table = 'posts';

    /**
     * Scope a query to only include products
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeProducts($query)
    {
        return $query->where('post_type', 'product');
    }
}

然后,您的控制器将如下所示:

<?php

public function all_products_page(Request $request)
{

    Post::products()->chunk(100, function ($products) {
        foreach ($products as $product) {
            // perform action here.
        }
    });
}