nailfor / redis
Eloquent like library for Redis
Requires
- php: >=7.1.0
- predis/predis: ^2.0
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.