Ichi ORM is aimed to be the fast performance and secure database ORM for PHP with simple usage.
This package is Open Source According to MIT license
- Installation
- Set up Database Connection
- Available Database Setting
- Table Structure
- Create Model From Commandline
- Configuration Table Name
- Configuration Primary Key
- CRUD
- Querying
- Using PDO Functions
- Using Different Databases
- JSON Response
- Caching
- Observers
composer require jijihohococo/ichi-orm
This library can connect MySQL, Postgres and MS SQL Server.
Firstly, you need to declare your database driver like below.
use JiJiHoHoCoCo\IchiORM\Database\Connector;
$connector=new Connector;
$connector->createConnection('mysql',[
'dbname' => 'database_name',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'host' => '127.0.0.1',
'user_name' => 'user_name',
'user_password' => 'user_password'
]);
If you want to add another custom database connection, you can do just like that.
You must add dbname,host,user_name and user_password in your database connection. I recomend you to use "utf8mb4" for your database charset and "utf8mb4_unicode_ci" for your database collation.
In defalt database connections, you don't need to add driver parameters but in your custom database connection you have to add driver parameters.
$connector->addConnection('new_mysql_connection')->createConnection('new_mysql_connection',[
'driver' => 'mysql',
'dbname' => 'database_name',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'host' => '127.0.0.1',
'user_name' => 'user_name',
'user_password' => 'user_password'
]);
Default database connections are 'mysql' , 'pgsql' and 'sqlsrv'.
Supported database drivers are 'mysql' , 'pgsql' and 'sqlsrv'.
After declaring database connection, you can select default database connection
$connector->selectConnection('mysql');
Name | Description | Required |
---|---|---|
driver | Database driver name | ✓ |
dbname | Database name | ✓ |
charset | Charset Font | |
collation | Collation Font Setting for MySQL and Postgres SQL | |
host | Database Host Address | ✓ |
user_name | Database User Name | ✓ |
user_password | Database User Password | ✓ |
unix_socket | Unix Socket For MySQL | |
port | Databse Port Number | |
strict (bool) | Strict Mode In MySQL | |
time_zone | Database Time Zone in MySQL and Postgres SQL | |
isolation_level | To set Isolation Level in MySQL | |
modes (array) | To set sql_mode in MySQL | |
synchronous_commit | To set Synchronous Commit in Postgres SQL | |
sslmode | To set SSL Mode in Postgres SQL | |
sslcert | To set SSL Certificate in Postgres SQL | |
sslkey | To set SSL Key in Postgres SQL | |
sslrootcert | To set SSL Root Certificate in Postgres SQL | |
readOnly (bool) | True To set ApplicationIntent to ReadOnly in MS SQL Server | |
pooling (bool) | True To set ConnectionPooling to true in MS SQL Server | |
application_name | To set APP in MS SQL Server OR application name in Postgres SQL | |
encrypt | To set ENCRYPT in MS SQL Server | |
trust_server_certificate | To set TrustServerCertificate in MS SQL Server | |
multiple_active_result_sets | To set MultipleActiveResultSets in MS SQL Server | |
transaction_isolation | To set TransactionIsolation in MS SQL Server | |
multi_subnet_failover | To set MultiSubnetFailover in MS SQL Server | |
column_encryption | To set ColumnEncryption in MS SQL Server | |
key_store_authentication | To set KeyStoreAuthentication in MS SQL Server | |
key_store_principal_id | TO set KeyStorePrincipalId in MS SQL Server | |
key_store_secret | To set KeyStoreSecret in MS SQL Server | |
login_timeout | To set LoginTimeout in MS SQL Server |
If you have the column named "deleted_at", be sure that the column is NULLABLE column.
Firstly you need to created the file named "ichi" under your project folder and use the below code in this file
#!/usr/bin/env php
<?php
require __DIR__.'/vendor/autoload.php';
use JiJiHoHoCoCo\IchiORM\Command\ModelCommand;
$modelCommand=new ModelCommand;
$modelCommand->run(__DIR__,$argv);
And then you can create the model in your commandline
php ichi make:model Blog
The default file folder is "app/Models". So after making command, the model you created will be in the this default file folder. If you want to change the default folder path, you can change it in your "ichi" file.
$modelCommand=new ModelCommand;
$modelCommand->setPath('new_app/Models');
$modelCommand->run(__DIR__,$argv);
In Ichi ORM, one model class which is extended "JiJiHoHoCoCo\IchiORM\Database\Model" abstract class is represented one table.
In default, the table name of the model class will show according to the format below
Model | Table |
---|---|
Item | items |
OrderItem | order_items |
If the above format is not suitable for the model class, you can customize in your model class
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
protected function getTable(){
return "order_item_details";
}
}
In default, the primary key for the table is represented "id". If you want to change that, you can customize in your model class
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
protected function getID(){
return "blog_id";
}
}
Firstly, you need to extend Model Class from your class and declare your data fields as attributes in your model as shown as below.
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
publilc $id,$author_id,$content,$created_at,$updated_at,$deleted_at;
}
You can create the data as shown as below.
Blog::create([
'author_id' => 1,
'content' => 'Content'
]);
It is your choice to add or not to add the nullable field data into array in "create" function.
If you have "created_at" data field, you don't need to add any data for that data field. Ichi ORM will automatically insert current date time for this data field. The data field must be in the format of timestamp or varchar.
You can get the new model object after creating.
App\Models\Blog Object ( [id] => 1 [author_id] => 1 [content] => Content [created_at] => 2021-10-01 12:02:26 [updated_at] => [deleted_at] => )
If you don't use auto increment id in your table you must write this function in your model class
protected function autoIncrementId(){
return FALSE;
}
And you must add your ID Values from your side manually like this
Blog::create([
'id' => 1 ,
'author_id' => 1,
'content' => 'Content'
]);
If you want to insert multiple rows in one query you can do according to below coding flow.
use App\Models\Blog;
$contents=$_REQUEST['content'];
$insertBlogs=[];
foreach ($contents as $key => $content) {
$insertBlogs[]=[
'content' => $content,
'author_id' => $_REQUEST['author_id'][$key]
];
}
Blog::insert($insertBlogs);
You can get your data by your primary key as shown as below.
Blog::find(1);
If you don't want to get your data by your primary key, you can do as shown as below.
Blog::findBy('content','Content');
First Parameter is field name and second parameter is value.
You can get only single object by using "find" and findBy" function.
If you have one to one relationship in your database (with foreign keys or without foreign keys), you can use "refersTo" function in child model class as shown as below. The function will output the single object.
You must add parent model name, the field that represent parent id into "refersTo" function if parent model's primary key is "id".
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
publilc $id,$author_id,$content,$created_at,$updated_at,$deleted_at;
public function author(){
return $this->refersTo('App\Models\Author','author_id');
}
}
You must add parent model name, the field name that represent parent id and parent primary key field into "refersTo" function if parent model's primary key is not "id".
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
publilc $id,$author_id,$content,$created_at,$updated_at,$deleted_at;
public function author(){
return $this->refersTo('App\Models\Author','author_id','authorID');
}
}
You can get parent data as single object in your controller or class.
use App\Models\Blog;
$blogObject=Blog::find(1);
$authorObject=$blogObject->author();
$authorId=$authorObject->id;
You don't need to worry about null. It has null safety.
If you have one to many relationship in your database (with foreign keys or without foreign keys), you can use "refersMany" function in parent model class as shown as below. The function will output the object array.
You must add child model name and the field name that represent parent id in child model into "refersMany" function if parent model's primary key is "id".
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Author extends Model{
publilc $id,$name,$created_at,$updated_at,$deleted_at;
public function blogs(){
return $this->refersMany('App\Models\Blog','author_id')->get();
}
}
You must add child model name, the field name that represent parent id in child model and parent primary key field into "refersMany" function if parent model's primary key is not "id".
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Author extends Model{
publilc $authorID,$name,$created_at,$updated_at,$deleted_at;
public function blogs(){
return $this->refersMany('App\Models\Blog','author_id','authorID')->get();
}
}
You can customize the child query
return $this->refersMany('App\Models\Blog','author_id','authorID')->latest()->get();
You can get child data as object array in your controller or class.
use App\Models\Author;
$authorObject=Author::find(1);
$blogs=$authorObject->blogs();
You can update your data as shown as below.
Blog::find(1)->update([
'content' => 'New Content'
]);
You can get the model object after updating
If you have "updated_at" data field, you don't need to add any data for that data field. Ichi ORM will automatically insert current date time for this data field. The data field must be in the format of timestamp or varchar.
App\Models\Blog Object ( [id] => 1 [author_id] => 1 [content] => New Content [created_at] => 2021-10-01 12:02:26 [updated_at] => 2021-10-01 12:03:26 [deleted_at] => )
If you want to update multiple rows in one query you can do according to below coding flow.
use App\Models\Blog;
$blogs=Blog::get();
$updateBlogs=[];
foreach($blogs as $key => $blog){
$updateBlogs[]=[
'content' => $_REQUEST['content'][$key],
'author_id' => $_REQUEST['author_id'][$key],
];
}
Blog::bulkUpdate($updateBlogs);
You can delete your data as shown as below.
Blog::find(1)->delete();
If you have "deleted_at" data field and "deleted_at" data field is nullable, you have soft delete function. So, the data will not actually delete after deleting but this data will not be shown in querying in default.
Soft Delete Functions can't be used if you don't have "delete_at" data field and the data will be deleted.
If you want to restore your soft deleted data, you can do as shown as before.
Blog::find(1)->restore();
If you want to force to delete your data (whatever it is able to be soft deleted or not), you can do as shown as before.
Blog::find(1)->forceDelete();
To make "SELECT" sql query, you can use "select" function as shown as below
Blog::select(['id'])
Blog::select(['blogs.id'])
Blog::select(['id','content'])
Blog::select(['blogs.id','blogs.content'])
You can get your query data with "get()" and "toArray()" functions.
"get()" function can use in main query and subquery. This function will return the object array of related model when it is used in main query as shown as below.
Array ( [0] => App\Models\Blog Object ( [id] => 1 [author_id] => 1 [content] => Content [created_at] => 2021-10-01 12:02:26 [updated_at] => 2021-10-01 12:02:26 [deleted_at] => ) )
You can call relationship functions directly with the object in the loop because "get()" function outputs the object array
$blogs=Blog::select(['id','content'])->get();
foreach($blogs as $blog){
echo $blog->id . '<br>';
echo $blog->author()->name . '<br>';
}
If you don't use select function, you will get all data fields of related model.
Blog::get();
"toArray()" function can use in only main query. This function will return the array for thre query as shown as below.
Array ( [0] => Array ( [id] => 1 [author_id] => 1 [content] => Content [created_at] => 2021-10-01 12:02:26 [updated_at] => 2021-10-01 12:02:26 [deleted_at] => ) )
You can't call relationship functions directly with the object in the loop because "toArray()" function outputs the array.
You can't use "toArray" function in subquery.
$blogs=Blog::select(['id','content'])->toArray();
foreach($blogs as $blog){
echo $blog['id'] . '<br>';
}
If you don't use select function, you will get all data fields of related model.
Blog::toArray();
If you have soft deleted data rows, you can't see those in your array or data object array. If you want to see the array or data object array with soft deleted data rows, you must use "withTrashed()" function as shown as below.
Blog::withTrashed()->select(['id','content'])->get();
Blog::withTrashed()->select(['id','content'])->toArray();
If you don't use select function, you will get all data fields of related model. You will also get soft deleted data rows if you use "withTrashed()" function.
Blog::withTrashed()->get();
Blog::withTrashed()->toArray();
To make limit sql query, you can use "limit" function and put the integer into this function as shown as below
In main query
Blog::limit(1)->get();
Blog::limit(1)->toArray();
In subquery
Blog::whereIn('id',function($query){
return $query->select(['id'])->limit(1)->get();
})->get();
Blog::whereIn('id',function($query){
return $query->select(['id'])->limit(1)->get();
})->toArray();
To make "WHERE" sql query, you can use "where" function as shown as below
In case of '='
Blog::where('id',1)->get();
If you want to add operators
Blog::where('id','=',1)->get();
Blog::where('content','like','%Content%')->get();
To make "OR WHERE" sql query, you can use "orWhere" function as shown as below
In case of '='
Blog::where('id',1)->orWhere('content','Content')->get();
If you want to add operators
Blog::where('id',1)->orWhere('content','=','Content')->get();
Blog::where('id',1)->orWhere('content','like','%Content%')->get();
To make "WHERE IN" sql query, you can use "whereIn" function as shown as below
Blog::whereIn('id',[1,2])->get();
To make "WHERE NOT IN" sql query, you can use "whereNotIn" function as shown as below
Blog::whereNotIn('id',[1,2])->get();
The rules and flows are same as SQL Join.
Single SQL Query
Author::innerJoin('blogs','authors.id','=','blogs.author_id')
->select(['authors.*','blogs.id AS blog_id'])
->get();
Subquery
Blog::where('id',function($query){
return $query->from('App\Models\Author')
->innerJoin('blogs','authors.id','=','blogs.author_id')
->select(['blogs.id AS blog_id'])
->get();
})->get();
Single SQL Query
Author::leftJoin('blogs','authors.id','=','blogs.author_id')
->select(['authors.*','blogs.id AS blog_id'])
->get();
Subquery
Blog::where('id',function($query){
return $query->from('App\Models\Author')
->leftJoin('blogs','authors.id','=','blogs.author_id')
->select(['blogs.id AS blog_id'])
->get();
})->get();
Single SQL Query
Author::rightJoin('blogs','authors.id','=','blogs.author_id')
->select(['authors.*','blogs.id AS blog_id'])
->get();
Subquery
Blog::where('id',function($query){
return $query->from('App\Models\Author')
->rightJoin('blogs','authors.id','=','blogs.author_id')
->select(['blogs.id AS blog_id'])
->get();
})->get();
You can use "union" function in queries.
Blog::where('id',1)->union(function(){
return Blog::where('id',2)->toSQL()->get();
})->get();
You can use "union" function in subqueries.
Blog::whereIn('id', function($query) {
return $query->select(['id'])->where('id',1)->union(function($query){
return $query->select(['id'])->where('id',2)->get();
})->get();
} )->get();
In this library, you can use two types of pagination.
- Database Pagination
- Array Pagination
The default paginated data per page is 10. You can customize that number. Pagination functions will output the array according to the below format. So, you can use server pagination into your frontend (like Vue and React) with that array data.
[
'current_page' => 'current page number',
'data' => 'paginated data',
'first_page_url' => 'first page url',
'from' => 'The number of paginated data which starts to show in current page',
'last_page' => 'The last page number',
'last_page_url' => 'The last page url',
'next_page_url' => 'The next page url',
'path' => 'the current page url',
'per_page' => 'The number of how many data will be shown per page',
'prev_page_url' => 'The previous page url',
'to' => 'The number of paginated data which is last data to show in current page',
'total' => 'The total number of paginated data in current page'
]
You can paginate your query result like that
$paginatedBlogs=Blog::whereIn('id',[1,2,3,4,5])->paginate();
You can customize the number of paginated data by
$paginatedBlogs=Blog::whereIn('id',[1,2,3,4,5])->paginate(12);
You can get paginated data like below. The data in "data" array key is object array.
foreach($paginatedBlogs['data'] as $blog){
echo $blog->id.'<br>';
echo $blog->author()->name . '<br>';
}
You can call relationship functions directly with the object in the loop.
You can use pagination user interface in your frontend php file like
(new JiJiHoHoCoCo\IchiORM\UI\Pagination)->paginate($paginatedBlogs);
You can customize the pagination user interface color
(new JiJiHoHoCoCo\IchiORM\UI\Pagination)->paginate($paginatedBlogs,'#000000');
You can paginate your array like below.
use JiJiHoHoCoCo\IchiORM\Pagination\ArrayPagination;
$blogs=['Blog One','Blog Two','Blog Three','Blog Four','Blog Five'];
$paginatedBlogs=(new ArrayPagination)->paginate($blogs);
You can also use multidimensional array
use JiJiHoHoCoCo\IchiORM\Pagination\ArrayPagination;
$blogs=[
[
'content' => 'Blog One',
'author_name' => 'John Doe'
],
[
'content' => 'Blog Two',
'author_name' => 'Joe Blow'
],
[
'content' => 'Blog Three',
'author_name' => 'Everyman'
],
[
'content' => 'Blog Four',
'author_name' => 'John Doe'
],
[
'content' => 'Blog Five',
'author_name' => 'John Doe'
]
];
$paginatedBlogs=(new ArrayPagination)->paginate($blogs);
You can customize the number of paginated data by
$paginatedBlogs=(new ArrayPagination)->paginate($blogs,2);
You can use pagination user interface in your frontend php file like
(new JiJiHoHoCoCo\IchiORM\UI\Pagination)->paginate($paginatedBlogs);
You can customize the pagination user interface color
(new JiJiHoHoCoCo\IchiORM\UI\Pagination)->paginate($paginatedBlogs,'#000000');
If you want to use subquery within one table you can do as shown as before.
You can use subqueries as shown as below in "where","orWhere" and "whereIn" functions.
Blog::whereIn('author_id',function($query){
return $query->select(['id'])->where('id',1)->get();
})->get();
If you want to use subquery from different table you can do as shown as before.
Blog::whereIn('author_id',function($query){
return $query->from('App\Models\Author')
->select(['id'])
->where('id',1)
->get();
})->get();
You can use "from" function in only subqueries. You need to add model class name which is represented the another table in "from" function.
If you want to use subquery in select, you can use "addSelect" and "addOnlySelect" functions.
"addSelect" function is making subquery in select query. It will select the data within its function with the data from "select" function. If you don't use "select" function, it will select the data within its function with the data of all fields' values of selected table.
Blog::select(['id','author_id'])
->addSelect(['autor_name' => function($query){
return $query->from(['App\Models\Author'])
->whereColumn('authors.id','blogs.author_id')
->limit(1)
->get();
}])->get();
You can't use "addSelect" function in subqueries
"addOnlySelect" function is making subquery in select query. It will select only the data within its function. You can't use other select functions("select" and "addSelect") if you want to use "addOnlySelect" function.
Blog::addOnlySelect(['autor_name' => function($query){
return $query->from(['App\Models\Author'])
->whereColumn('authors.id','blogs.author_id')
->limit(1)
->get();
}])->get();
You can use "addOnlySelect" function in subqueries
You can use PDO functions like that. You can use all PDO functions according to https://www.php.net/manual/en/class.pdo.php
If you want to use default database connection with PDO object
$pdo=connectPDO();
If you want to use selected database connection with PDO object
use JiJiHoHoCoCo\IchiORM\Database\Connector;
$pdo=Connector::getInstance()->executeConnect('new_mysql_connection');
If you have the model which is from different database you can connect like that
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
use JiJiHoHoCoCo\IchiORM\Database\Connector;
class Author extends Model{
protected function connectDatabase(){
return Connector::getInstance()->executeConnect('new_mysql_connection');
}
}
When you want to do json data of for your API you can simply do as shown as below.
return jsonResponse([
'blogs' => Blog::get()
]);
You can customize http response code for json response. Default http response code is 200.
return jsonResponse([
'blogs' => Blog::get()
],202);
If you want to customize your JSON data, firstly you need to create the class.
You must extend "JiJiHoHoCoCo\IchiORM\Resource\ResourceCollection" abstract class and declare "getSelectedResource()" function for your all resource collection classes.
namespace App\Resources;
use JiJiHoHoCoCo\IchiORM\Resource\ResourceCollection;
class BlogResourceCollection extends ResourceCollection{
public function getSelectedResource($data){
return [
'id' => $data->id,
'author_id' => $data->author_id,
'content' => $data->content,
'created_at' => $data->created_at,
'updated_at' => $data->updated_at
];
}
}
You can create the resource class via terminal after creating "ichi" file as we mentioned in Create Model From Commandline
php ichi make:resource BlogResourceCollection
The default path for observer is "app/Resources". You can also change this in "ichi" file.
$modelCommand=new ModelCommand;
$modelCommand->setResourcePath('new_app/Resources');
$modelCommand->run(__DIR__,$argv);
And then, you can do to show to your custom JSON Resource as shown as below.
For Object Array-
return jsonResponse([
'blogs' => (new BlogResourceCollection)->collection( Blog::get() )
]);
For Single Object-
return jsonResponse([
'blog' => (new BlogResourceCollection)->singleCollection( Blog::find(1) )
]);
You can declare your relationship in your resource collection class (For refers to and refers many).
namespace App\Resources;
use JiJiHoHoCoCo\IchiORM\Resource\ResourceCollection;
class BlogResourceCollection extends ResourceCollection{
public function getSelectedResource($data){
return [
'id' => $data->id,
'author' => $data->author(),
'content' => $data->content,
'created_at' => $data->created_at,
'updated_at' => $data->updated_at
];
}
}
You can declare another resource collection (according to the data is single object or object array) in your resource collection class.
namespace App\Resources;
use JiJiHoHoCoCo\IchiORM\Resource\ResourceCollection;
use App\Resources\AuthorResourceCollection;
class BlogResourceCollection extends ResourceCollection{
public function getSelectedResource($data){
return [
'id' => $data->id,
'author_id' => $data->author_id,
'author' => (new AuthorResourceCollection)->singleCollection( $data->author() ) ,
'content' => $data->content,
'created_at' => $data->created_at,
'updated_at' => $data->updated_at
];
}
}
namespace App\Resources\AuthorResourceCollection;
use JiJiHoHoCoCo\IchiORM\Resource\ResourceCollection;
class AuthorResourceCollection extends ResourceCollection{
public function getSelectedResource($data){
return [
'id' => $data->id,
'name' => $data->name
];
}
}
You can cache your query data with redis or memcached extensions in this library.
Firstly, you need to pass the object of redis or memcached into the "JiJiHoHoCoCo\IchiORM\Cache\CacheModel" static function "setCacheObject" like below.
With Redis
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
use Redis;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
CacheModel::setCacheObject($redis);
With Memcached
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
use Memcached;
$memcached = new Memcached();
$memcached->addServer('127.0.0.1',11211);
CacheModel::setCacheObject($memcached);
It might be different of connecting the way of redis or memcached to each other according to the security and ports' availabilities. The important thing is you must pass the redis or memcached object into the "setCacheObject" static function of "JiJiHoHoCoCo\IchiORM\Cache\CacheModel".
And then, you can call the cache functions to store and get.
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
use App\Models\Blog;
$blogs=CacheModel::remember('blogs',function(){
return Blog::whereIn('author_id',[1,2,3])->get();
},100);
In "remember" function you must declare the cached key name,and the stored query or data and expired time in seconds. Without adding expired time is also ok but it will save the data into the unlimited time. This function will store the data if the declared cached key is not in the cached server and get the cached data if the declared cached key is in the cached server.
The default stored time is unlimited. So you must declare the stored time for your cached server
If you want to delete your cached key, you can do
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
CacheModel::remove('blogs');
You can just save your data in your cache
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
$blogs=CacheModel::save('blogs',function(){
return Blog::whereIn('author_id',[1,2,3])->get();
},100);
To get your cached data
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
$cachedBlogs=CacheModel::get('blogs');
You can get back your redis object to implement the functions of redis extension.
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
$redisObject=CacheModel::getRedis();
You can also get back your memcached object to implement the functions of memcached.
use JiJiHoHoCoCo\IchiORM\Cache\CacheModel;
$memcachedObject=CacheModel::getMemcached();
To make observers firstly you need to create the observer class which implements "JiJiHoHoCoCo\IchiORM\Observer\ModelObserver" interface.
In this created class, you must declare the functions as shown as below.
namespace App\Observers;
use JiJiHoHoCoCo\IchiORM\Observer\ModelObserver;
use App\Models\Blog;
class BlogObserver implements ModelObserver{
public function create($blog){
}
public function update($blog){
}
public function delete($blog){
}
public function restore($blog){
}
public function forceDelete($blog){
}
}
- "create" function will load after creating the data of blog model.
- "update" function will load after updating the data of blog model.
- "delete" function will load after deleting the data of blog model.
- "restore" function will load after restoring the soft deleted data of blog model.
- "forceDelete" function will load after force deleting the data of blog model.
You can create the observer via terminal after creating "ichi" file as we mentioned in Create Model From Commandline
php ichi make:observer BlogObserver
The default path for observer is "app/Observers". You can also change this in "ichi" file.
$modelCommand=new ModelCommand;
$modelCommand->setObserverPath('new_app/Observers');
$modelCommand->run(__DIR__,$argv);
After creating observer, you must do
use App\Models\Blog;
use App\Observers\BlogObserver;
Blog::observe(new BlogObserver);
You can also add many observers for one model
use App\Models\Blog;
use App\Observers\{BlogObserver,BlogDataObserver};
Blog::observe(new BlogObserver);
Blog::observe(new BlogDataObserver);
The observers' functions will load sequetly.
If you want to observe your custom function
In model
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
publilc $id,$author_id,$content,$created_at,$updated_at,$deleted_at;
public function customFunction(){
/*----- your business logic -----*/
//--- Example to pass one parameter into observer function ---//
$currentObject=$this;
self::$observerSubject->use(get_class($this),'customFunction',$currentObject);
}
}
In observer
namespace App\Observers;
use JiJiHoHoCoCo\IchiORM\Observer\ModelObserver;
use App\Models\Blog;
class BlogObserver implements ModelObserver{
public function customFunction($blog){
}
}
If you need to pass multiple parameters in observer function.
In model
namespace App\Models;
use JiJiHoHoCoCo\IchiORM\Database\Model;
class Blog extends Model{
publilc $id,$author_id,$content,$created_at,$updated_at,$deleted_at;
public function author(){
return $this->refersTo('App\Models\Author','author_id');
}
public function customFunction(){
/*----- your business logic -----*/
//--- Example to pass multiple parameter into observer function ---//
$currentObject=$this;
$author=$this->author();
self::$observerSubject->use(get_class($this),'customFunction',[$currentObject,$author]);
}
}
In observer
namespace App\Observers;
use JiJiHoHoCoCo\IchiORM\Observer\ModelObserver;
use App\Models\{Blog,Author};
class BlogObserver implements ModelObserver{
public function customFunction($blog,$author){
}
}