Laravel - Как кэшировать пользовательский запрос с помощью Redis - PullRequest
0 голосов
/ 01 апреля 2020

Как я могу кэшировать пользовательский запрос в 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,

1 Ответ

0 голосов
/ 02 апреля 2020

Я предполагаю, что вы используете один из laravel сервисов, таких как очередь или что-то еще, если да, в вашем случае laravel пытается использовать serialize () функцию для сериализации свойств класса, но одна проблема функция serialize() заключается в том, что она не может сериализовать закрытие, которое вы передаете
анонимные функции не могут быть сериализованы , то есть php поведение

Что вы можете сделать, это попытаться назначить Результат в свойство или передать результат в конструктор ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...