nailfor/redis

Eloquent like library for Redis

v0.1.7 2024-11-21 10:29 UTC

This package is not auto-updated.

Last update: 2025-01-02 11:14:36 UTC


README

Redis client for Eloquent ORM

Features

All models are inherited from Illuminate\Database\Eloquent\Model so most methods work natively

Model Supports

Key Supports

Key structure

Sample key structure for a Redis model in Laravel:

{config.redis.options.prefix}{model_table_name|class_name}:{primary_key}

  • model_table_name: The name of the current model table which set like 'protected $table = "name"'.
  • primary_key: The primary key of the model (id).

Example key:

rdb_product:1

Installation

The preferred way to install this extension is through composer.

Either run

composer require nailfor/redis

or add

"nailfor/redis" : "*"

to the require section of your application's composer.json file.

Configure

Add config/app.php

    'providers' => [
        ...
        nailfor\Redis\RedisServiceProvider::class,

and config/database.php

    'connections' => [
        ...
        'redis' => [ //the name of connection in your models(default)
            'driver'    => 'redis',
        ],

Usage

Models

├── DbProduct.php
├── RdbBrand.php
├── RdbProduct.php
└── User.php

DbProduct is a regular Eloquent model.

<?php

namespace App\Models;

use App\Models\DbCategory;
use App\Models\RdbBrand;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;

class DbProduct extends Model
{
    protected $table = 'product';

    //sql to sql relationship
    public function Category(): BelongsTo 
    {
        return $this->belongsTo(DbCategory::class, 'category_id');
    }

    //sql to redis relationship
    public function Brand(): HasOne
    {
        return $this->hasOne(RdbBrand::class, 'brand_id');
    }
}

RdbProduct is a redis cache for DbProduct

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\BelongsTo;
use nailfor\Redis\Eloquent\Model;

class RdbProduct extends Model
{
    protected $table = 'product';

    protected $fillable = [
        'id',
        'name',
        'article',
        'brand_id',
        'category_id',
    ];

    //Since the model type is HSET, all fields are stored as a string.
    protected $casts = [
        'id' => 'integer',
        'brand_id' => 'integer',
    ];

    //redis to redis relationship
    public function Brand(): BelongsTo
    {
        return $this->belongsTo(RdbBrand::class, 'brand_id');
    }

    //redis to sql relationship
    public function Category(): BelongsTo
    {
        return $this->belongsTo(DbCategory::class, 'category_id');
    }
}

RdbBrand some Redis model for Brands

<?php

namespace App\Models;

use nailfor\Redis\Eloquent\Model;

class RdbBrand extends Model
{
    //without var $table the key will be "rdb_brand"
}

Insert

    $product = DbProduct::find(1);

    $db              = new RdbProduct();
    $db->id          = $product->id;
    $db->name        = $product->name;
    $db->article     = $product->article;
    $db->brand_id    = $product->brand_id;
    $db->category_id = $product->category_id;
    $db->save();

Or, because we set $fillable

    $product = DbProduct::find(1);

    $db = new RdbProduct();
    $db->fill($product->toArray());
    $db->save();

Retrieving Models

    $product = RdbProduct::find(2);
    //or
    $product = RdbProduct::where('id', 2)
        ->whereIn('brand_id', [1,2,3])
        ->orWhere('article', 'SV-FX-02')
        ->first();
    //get all products
    $products = RdbProduct::with([
            'Brand',
        ])
        ->get()
    ;

    //get only id 1,2,3...
    $products = RdbProduct::with([
            'Brand',
            'Category',
        ])
        ->whereIn('id', [1,2,3])
        ->get()
    ;

    foreach($products as $product) {
        $brand      = $product->Brand;      //relation to Redis model RdbBrand
        $category   = $product->Category;   //relation to SQL model DbCategory

        //of course u can modify this models here
        $brand->type = 'sometype';
        $brand->save();
    }

Delete Models

    //truncate all product:*
    RdbProduct::delete();

    //deleting by condition
    RdbProduct::where('brand_id', 4)->delete();
    RdbProduct::where('id', 2)
        ->orWhere('brand_id', 5)
        ->delete();
    RdbProduct::where('article', 'VGX-01')
        ->whereIn('brand_id', [1,2,4])
        ->delete()
    ;

    //deleting single model
    $model = RdbProduct::find(1);
    $model->delete();

Expire and TTL

    $db = new RdModel;
    $db->id = 'key';
    $db->save();

    $timeInSeconds = 5;
    $db->expire($timeInSeconds);

    $db = new RdModel;
    $db->id = 'key';
    $ttl = $db->ttl(); //this op working w/o save model

Credits

License

The GNU License (GNU). Please see License File for more information.