【问题标题】:Laravel- How to cache custom query with RedisLaravel-如何使用 Redis 缓存自定义查询
【发布时间】:2020-07-13 18:02:21
【问题描述】:

如何将自定义查询缓存到 redis。我正在尝试以下方法

public function __construct()
{
    $this->orders_sql = Cache::remember('orders', 10, function () {
        return $query = DB::connection('db1')->table('orders as o')
            ->leftJoin('addresses as pa', 'o.id', '=', 'pa.order_id')
            ->leftJoin('users as u', 'o.user_id', '=', 'u.id')
            ->leftJoin('clients', 'clients.user_id', '=', 'u.id')
            ->select(
                'o.id as id', 'o.type as type', 'o.extra_info as extra_info', 'o.status as order_status', 'o.created_at as created_at', 'o.type as order_type', 'o.inspection_date as inspection_date', 'o.assignee as assignee', 'o.user_id as user_id', 'o.inspector_name as inspector_name',
                'pa.address as address', 'pa.city as city', 'pa.state as state',
                'clients.first_name as first_name', 'clients.middle_name as middle_name', 'clients.last_name as last_name'
            )
            ->whereIn('o.status', OrderHelper::$ALLOWED_STATUS)
            ->where('o.type', '<>', OrderHelper::$CONSTRUCTION_EXISTING)
            ->where('o.deleted_at', null);
    });
}
public function orders($sort_by, $sort_order, $limit, $filters)
    {
        if ($filters) {
            $query = $this->applyFilters($filters);
        }
        $orders = $query->orderBy($sort_by ?? OrderHelper::$DEFAULT_SORT_COLUMN, $sort_order ?? OrderHelper::$DEFAULT_SORT_ORDER);
        if ($limit === 'all') {
            $orders = $orders->get();
        } else {
            $orders = $orders->get();
//            $orders = $orders->paginate($limit ?? CommonHelper::$DEFAULT_PAGINATION_LIMIT);
        }
        //adding more information with orders such as Bank and address info
        foreach ($orders as $order) {
            $order->created_at = OrderHelper::getFormattedDate($order->id);
            $order->draw = OrderHelper::draw($order->id);
            $order->inspection_date = OrderHelper::getFormattedInspectionDate($order->inspection_date);
            $order->client_name = $order->first_name . ' ' . $order->middle_name . ' ' . $order->last_name;
            $order->type = OrderHelper::getFormattedOrderType($order);
            if (empty($order->assignee)) {
                $order->inspector_name = '-';
            }
        }
        return $orders ? $orders : false;
    }

我得到的错误是

"message": "Serialization of 'Closure' is not allowed",
    "exception": "Exception",
    "file": "/var/www/api.local/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php",
    "line": 295,

【问题讨论】:

  • 这没用。您正在缓存查询,但是,在从 redis 获取查询后,它仍然需要在 DB 中运行以获取结果。而且,数据库已经缓存了下一个请求的查询。

标签: laravel caching eloquent redis


【解决方案1】:

我猜您正在使用诸如队列之类的 laravel 服务之一,如果您的情况是,laravel 尝试使用 serialize() 函数来序列化类属性,但 serialize() 函数的一个问题是它无法序列化您正在传递的闭包
无法序列化匿名函数这是 php 行为

你可以做的是尝试将结果分配给属性或将结果传递给构造函数...

【讨论】:

  • 我需要停止对 DB 的调用。这样我仍然会向 DB 发送调用
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2017-05-24
相关资源
最近更新 更多