01-19-2021, 12:41 PM
01-19-2021, 11:41 PM
I hope I understood your question correctly.
As far as I am concerned, CI does not inherently support one-to-many relation between relational database rows in its DB / entity logic. I myself solved this by creating a sort of higher-order database entity class that takes care of that.
As a side note, I do not expect CI to support it directly, as, in my opinion, it is beyond the scope of this lightweight framework.
As far as I am concerned, CI does not inherently support one-to-many relation between relational database rows in its DB / entity logic. I myself solved this by creating a sort of higher-order database entity class that takes care of that.
As a side note, I do not expect CI to support it directly, as, in my opinion, it is beyond the scope of this lightweight framework.
01-22-2021, 05:14 AM
(01-19-2021, 11:41 PM)bivanbi Wrote: [ -> ]I hope I understood your question correctly.okay i find he way tp manege problem i wanna show me your code too
As far as I am concerned, CI does not inherently support one-to-many relation between relational database rows in its DB / entity logic. I myself solved this by creating a sort of higher-order database entity class that takes care of that.
As a side note, I do not expect CI to support it directly, as, in my opinion, it is beyond the scope of this lightweight framework
and i also share my code here too
01-23-2021, 08:55 AM
01-23-2021, 12:43 PM
(01-23-2021, 08:55 AM)nicojmb Wrote: [ -> ]Have you seen this addin?no i ve never seen these
https://github.com/tattersoftware/codeig...-relations
here s my code
before paste code here i need expline i have two data base which they connected by F-key advertisement and advertisement_media
code for migration both tables
PHP Code:
<?php namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Advertisement extends Migration
{
//
public function up()
{
/*
* Setting
*/
$this->forge->addField([
'id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'auto_increment' => true],
'name' => ['type' => 'varchar', 'constraint' => 255],
'link' => ['type' => 'varchar', 'constraint' => 255],
'status' => ['type' => 'tinyint', 'constraint' => 1, 'null' => 0, 'default' => 1],
'created_at' => ['type' => 'datetime', 'null' => true],
'updated_at' => ['type' => 'datetime', 'null' => true],
'deleted_at' => ['type' => 'datetime', 'null' => true],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('advertisement', true);
}
//--------------------------------------------------------------------
public function down()
{
// drop constraints first to prevent errors
if ($this->db->DBDriver != 'SQLite3') {
// $this->forge->dropForeignKey('auth_tokens', 'auth_tokens_user_id_foreign');
}
$this->forge->dropTable('advertisement', true);
}
}
////////////////////////////////////////////////////////////////////////
<?php namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AdvertisementMedia extends Migration
{
public function up()
{
//
/*
* Setting
*/
$this->forge->addField([
'id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'auto_increment' => true],
'advertisement_id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true],
'path' => ['type' => 'varchar', 'constraint' => 255],
]);
$this->forge->addKey('id', true);
$this->forge->addForeignKey('advertisement_id', 'advertisement', 'id', false, 'CASCADE');
$this->forge->createTable('advertisement_media', true);
}
//--------------------------------------------------------------------
public function down()
{
// drop constraints first to prevent errors
if ($this->db->DBDriver != 'SQLite3') {
// $this->forge->dropForeignKey('auth_tokens', 'auth_tokens_user_id_foreign');
}
$this->forge->dropTable('advertisement_media', true);
}
}
code for models both tables
PHP Code:
<?php namespace App\Models;
use App\Entities\AdvertisementEntity;
use App\Entities\NewsPostEntity;
use CodeIgniter\Model;
class AdvertisementModal extends Model
{
protected $table = 'advertisement';
protected $primaryKey = 'id';
protected $returnType = AdvertisementEntity::class;
protected $allowedFields = [
'name',
'link',
'status',
'created_at',
'updated_at',
'deleted_at'
];
protected $useSoftDeletes = false;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $validationRules = [
'name' => 'required|min_length[3]|max_length[255]',
'link' => 'required|alpha_numeric_punct',
];
protected $validationMessages = [];
protected $skipValidation = false;
}
/////////////////////////////////
<?php namespace App\Models;
use App\Entities\AdvertisementMediaEntity;
use App\Entities\ContactFileEntity;
use App\Entities\NewsMediaEntity;
use CodeIgniter\Model;
class AdvertisementMediaModel extends Model
{
protected $table = 'advertisement_media';
protected $primaryKey = 'id';
protected $returnType = AdvertisementMediaEntity::class;
protected $allowedFields = [
'image',
'advertisement_id',
'path',
];
protected $validationRules = [
];
protected $validationMessages = [];
protected $skipValidation = false;
}
code for entities both tables
PHP Code:
<?php namespace App\Entities;
use \CodeIgniter\Entity;
use CodeIgniter\I18n\Time;
class AdvertisementEntity extends Entity
{
public function __construct(array $data = null)
{
parent::__construct($data);
}
protected $id;
protected $name;
protected $link;
protected $status;
protected $created_at;
protected $updated_at;
protected $deleted_at;
protected $attributes = [
'id' => null,
'name' => null,
'link' => null,
'status' => null,
'created_at' => null,
'updated_at' => null,
'deleted_at' => null,
];
protected $datamap = [
];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'status' => 'boolean',
];
protected $permissions = [];
protected $roles = [];
public function disableStatus()
{
$this->attributes['status'] = 0;
return $this;
}
public function enableStatus()
{
$this->attributes['status'] = 1;
return $this;
}
public function isStatus(): bool
{
return isset($this->attributes['status']) && $this->attributes['status'] == true;
}
public function createdAt()
{
// date_default_timezone_set('Asia/Tehran');
$this->attributes['created_at'] = date('Y-m-d H:i:s', time());
// $this->attributes['created_at'] = new Time(date('Y-m-d H:i:s', time()), 'UTC');
return $this;
}
public function updatedAt()
{
// date_default_timezone_set('Asia/Tehran');
$this->attributes['updated_at'] = date('Y-m-d H:i:s', time());
return $this;
}
}
/////////////////////////////////
<?php namespace App\Entities;
use \CodeIgniter\Entity;
use CodeIgniter\I18n\Time;
class AdvertisementMediaEntity extends Entity
{
protected $id;
protected $advertisement_id;
protected $path;
protected $attributes = [
'id' => null,
'advertisement_id' => null,
'path' => null,
];
protected $datamap = [
];
protected $dates = [];
protected $casts = [
];
protected $permissions = [];
protected $roles = [];
public function editPath()
{
$this->attributes['path'] = 'public/upload/advertisement/' . $this->attributes['path'];
return $this;
}
}
code for resource controllers both tables
PHP Code:
<?php
namespace App\Controllers\Api;
use App\Entities\AdvertisementEntity;
use App\Entities\NewsPostEntity;
use App\Libraries\ParameterDataInput;
use App\Models\AdvertisementMediaModel;
use App\Models\AdvertisementModal;
use CodeIgniter\HTTP\ResponseInterface;
use \App\Models\NewsPostModal;
class Advertisement extends ApiController
{
/**
* index function
* @method : GET
*/
public function index()
{
$advertisementModel = new AdvertisementModal();
$parameterDataInput = new ParameterDataInput();
$parameterDataInput->receiveParameters();
$result = $advertisementModel->like($parameterDataInput->getFilterExplode('key'), $parameterDataInput->getFilterExplode('value'))->orderBy($parameterDataInput->getSortExplode('key'), $parameterDataInput->getSortExplode('value'))->paginate(10, 'default', $parameterDataInput->getPage());
$advertisementMediaModel = new AdvertisementMediaModel();
for ($i = 0; $i < count($result); $i++)
$result[$i]->media = $advertisementMediaModel->where(['advertisement_id' => $result[$i]->id])->findAll();
return $this->respond([
'data' => $result,
//'data' => $advertisementModel->like($parameterDataInput->getFilterExplode('key'), $parameterDataInput->getFilterExplode('value'))->orderBy($parameterDataInput->getSortExplode('key'), $parameterDataInput->getSortExplode('value'))->paginate(10, 'default', $parameterDataInput->getPage()),
'pager' => $advertisementModel->pager->getDetails()
], ResponseInterface::HTTP_OK, 'get all advertisement post');
}
/**
* show function
* @method : GET with params ID
*/
public function show($id = null)
{
$advertisementModel = new AdvertisementModal();
$advertisementMediaModel = new AdvertisementMediaModel();
$json = $this->request->getJSON();
if (!isset($id)) {
$id = $json->id;
}
$result = $advertisementModel->where('id', $id)->paginate(1, 'default');
for ($i = 0; $i < count($result); $i++)
$result[$i]->media = $advertisementMediaModel->where(['advertisement_id' => $result[$i]->id])->findAll();
return $this->respond([
'data' => $result,
'pager' => $advertisementModel->pager->getDetails()
], ResponseInterface::HTTP_OK, 'get advertisement information');
}
/**
* create function
* @method : POST
*/
public function create()
{
$advertisementModel = new AdvertisementModal();
$advertisementEntity = new AdvertisementEntity();
if ($this->request->getJSON()) {
$rules = [
'name' => 'required|min_length[3]|max_length[255]',
'link' => 'required|alpha_numeric_punct',
];
if (!$this->validate($rules)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false
], ResponseInterface::HTTP_NOT_ACCEPTABLE, 'error during advertisement validate ');
};
$advertisementEntity->name = $this->request->getJSON()->name;
$advertisementEntity->link = $this->request->getJSON()->link;
$advertisementEntity->enableStatus();
$advertisementEntity->createdAt();
if (!$advertisementModel->save($advertisementEntity)) {
return $this->respond([
'error' => $advertisementModel->errors(),
'success' => false,
], ResponseInterface::HTTP_BAD_REQUEST, ' cant save advertisement ');
}
return $this->respond([
'insertId' => $advertisementModel->getInsertID()
], ResponseInterface::HTTP_CREATED, ' advertisement save successfully ');
}
}
/**
* update function
* @method : PUT or PATCH
*/
public function update($id = null)
{
$advertisementModel = new AdvertisementModal();
$advertisementEntity = new AdvertisementEntity();
if ($this->request->getJSON()) {
//get request from Vue Js
$json = $this->request->getJSON();
if (!isset($id)) {
$id = $json->id;
}
$rules = [
'name' => 'required|min_length[3]|max_length[255]',
'link' => 'required|alpha_numeric_punct',
];
if (!$this->validate($rules)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false
], ResponseInterface::HTTP_NOT_ACCEPTABLE, 'error during edit advertisement validate ');
}
$ads = $advertisementModel->where('id', $id)->first();
if (is_null($ads)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false
], ResponseInterface::HTTP_NOT_FOUND, ' advertisement did not exist ');
}
$advertisementEntity->name = $this->request->getJSON()->name;
$advertisementEntity->link = $this->request->getJSON()->link;
$advertisementEntity->id = $id;
$advertisementEntity->status = $this->request->getJSON()->status;
$advertisementEntity->updatedAt();
if (!$advertisementModel->update($id, $advertisementEntity)) {
return $this->respond([
'error' => $advertisementModel->errors(),
'success' => false,
], ResponseInterface::HTTP_BAD_REQUEST, 'error advertisement ');
}
return $this->respond([
], ResponseInterface::HTTP_OK, ' advertisement information updated ');
}
}
/**
* edit function
* @method : DELETE with params ID
*/
public function delete($id = null)
{
$advertisementModel = new AdvertisementModal();
$json = $this->request->getJSON();
if (!isset($id)) {
$id = $json->id;
}
$isExist = $advertisementModel->find($id);
if ($isExist) {
$advertisementModel->delete($id);
}
return $this->respond([
], ResponseInterface::HTTP_OK, ' advertisement delete it');
}
}
////////////////////////////
<?php
namespace App\Controllers\Api;
use App\Entities\AdvertisementMediaEntity;
use App\Entities\NewsMediaEntity;
use App\Entities\ViewsMediaEntity;
use App\Libraries\HandyFunction;
use App\Libraries\ParameterDataInput;
use App\Models\AdvertisementMediaModel;
use App\Models\AdvertisementModal;
use CodeIgniter\HTTP\ResponseInterface;
use \App\Models\NewsMediaModel;
class AdvertisementMedia extends ApiController
{
/**
* index function
* @method : GET
*/
public function index()
{
$advertisementMediaModel = new AdvertisementMediaModel();
$parameterDataInput = new ParameterDataInput();
$parameterDataInput->receiveParameters();
return $this->respond([
'data' => $advertisementMediaModel->like($parameterDataInput->getFilterExplode('key'), $parameterDataInput->getFilterExplode('value'))->orderBy($parameterDataInput->getSortExplode('key'), $parameterDataInput->getSortExplode('value'))->paginate(10, 'default', $parameterDataInput->getPage()),
'pager' => $advertisementMediaModel->pager->getDetails()
], ResponseInterface::HTTP_OK, 'get all advertisement media file');
}
/**
* show function
* @method : GET with params ID
*/
public function show($id = null)
{
$advertisementMediaModel = new AdvertisementMediaModel();
$json = $this->request->getJSON();
if (!isset($id)) {
$id = $json->id;
}
return $this->respond([
'data' => $advertisementMediaModel->where('id', $id)->paginate(1, 'default'),
'pager' => $advertisementMediaModel->pager->getDetails()
], ResponseInterface::HTTP_OK, 'get advertisement media information');
}
/**
* create function
* @method : POST
*/
public function create()
{
$advertisementMediaModel = new AdvertisementMediaModel();
$customConfig = new \Config\Custom();
$imageService = \Config\Services::image();
$advertisementMediaEntity = new AdvertisementMediaEntity();
if ($this->request->getPost()) {
$rules = [
'image' => 'uploaded[image]|max_size[image,4096]|ext_in[image,png,jpg,mp4,gif]'
];
if (!$this->validate($rules)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false,
'fff'=>$this->request->getFiles()
], ResponseInterface::HTTP_NOT_ACCEPTABLE, 'error during advertisement media validate ');
}
if (isset($_FILES['image'])) {
foreach ($this->request->getFileMultiple('image') as $avatar) {
$avatar->move($customConfig->uploadDirectory . '/advertisement', time() . '.' . $avatar->getClientExtension());
$advertisementMediaEntity->advertisement_id = $this->request->getPost('advertisement_id');
$advertisementMediaEntity->path = $avatar->getName();
$advertisementMediaEntity->editPath();
if (!$advertisementMediaModel->save($advertisementMediaEntity)) {
return $this->respond([
'error' => $advertisementMediaModel->errors(),
'success' => false,
], ResponseInterface::HTTP_BAD_REQUEST, 'error advertisement media ');
}
}
}
return $this->respond([
'data' => ''
], ResponseInterface::HTTP_CREATED, 'advertisement media save successfully ');
}
}
/**
* update function
* @method : PUT or PATCH
*/
public function update($id = null){
$advertisementMediaModel = new AdvertisementMediaModel();
$customConfig = new \Config\Custom();
$imageService = \Config\Services::image();
$handy = new HandyFunction();
$advertisementMediaEntity = new AdvertisementMediaEntity();
if ($this->request) {
$rules = [
'image' => 'uploaded[image]|max_size[image,4096]|ext_in[image,png,jpg,,mp4,gif]'
];
if (!$this->validate($rules)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false,
'fff'=>$this->request->getFiles()
], ResponseInterface::HTTP_NOT_ACCEPTABLE, 'error during advertisement media validate ');
}
$adsMedia = $advertisementMediaModel->where('id', $id)->first();
if (is_null($adsMedia)) {
return $this->respond([
'error' => $this->validator->getErrors(),
'success' => false
], ResponseInterface::HTTP_NOT_FOUND, ' advertisement media did not exist ');
}
$isExist = $advertisementMediaModel->where(['advertisement_id' => $this->request->getPost('advertisement_id')])->findAll();
if ($isExist) {
$advertisementMediaModel->where('advertisement_id', $this->request->getPost('advertisement_id'))->delete();
foreach ($isExist as $path) {
$handy->removeSingleFile(ROOTPATH . $path->path);
}
}
if (isset($_FILES['image'])) {
foreach ($this->request->getFileMultiple('image') as $avatar) {
$avatar->move($customConfig->uploadDirectory . '/advertisement', time() . '.' . $avatar->getClientExtension());
$advertisementMediaEntity->advertisement_id = $this->request->getPost('advertisement_id');
$advertisementMediaEntity->path = $avatar->getName();
$advertisementMediaEntity->editPath();
if (!$advertisementMediaModel->save($advertisementMediaEntity)) {
return $this->respond([
'error' => $advertisementMediaModel->errors(),
'success' => false,
], ResponseInterface::HTTP_BAD_REQUEST, 'error advertisement media ');
}
}
}
return $this->respond([
], ResponseInterface::HTTP_OK, ' advertisement media information updated ');
}
}
/**
* edit function
* @method : DELETE with params ID
*/
public function delete($id = null)
{
$advertisementMediaModel = new AdvertisementMediaModel();
$handy = new HandyFunction();
$json = $this->request->getJSON();
if (!isset($id)) {
$id = $json->id;
}
$isExist = $advertisementMediaModel->where(['id' => $id])->findAll();
if ($isExist) {
$advertisementMediaModel->where('id', $id)->delete();
foreach ($isExist as $path) {
$handy->removeSingleFile(ROOTPATH . $path->path);
}
return $this->respond([
], ResponseInterface::HTTP_OK, 'advertisement media delete it');
}
}
}
01-23-2021, 02:01 PM
(01-23-2021, 08:55 AM)nicojmb Wrote: [ -> ]Have you seen this addin?thats oky for database rdbms but not suitable for url
https://github.com/tattersoftware/codeig...-relations
url should be like these bellow
[color=rgba(232, 230, 227, 0.9)]Use forward slash (/) to indicate hierarchical relationships[/color]
http://api.example.com/device-management
http://api.example.com/device-management...ed-devices
http://api.example.com/device-management...evices/{id}
http://api.example.com/device-management...d}/scripts
http://api.example.com/device-management...cripts/{id}
PHP Code:
$routes->get('x/new', 'X::new');
$routes->post('x/create', 'X::create');
$routes->post('x', 'X::create'); // alias
$routes->get('x', 'X::index');
$routes->get('x/show/(:segment)', 'X::show/$1');
$routes->get('x/(:segment)', 'X::show/$1'); // alias
$routes->get('x/edit/(:segment)', 'X::edit/$1');
$routes->post('x/update/(:segment)', 'X::update/$1');
$routes->get('x/remove/(:segment)', 'X::remove/$1');
$routes->post('x/delete/(:segment)', 'X::update/$1');
$routes->get('x/(:segment)/y/new', 'Y::new/$1');
$routes->post('x/(:segment)/y', 'Y::create/$1');
$routes->get('x/(:segment)/y', 'Y::index/$1');
$routes->get('x/(:segment)/y/(:segment)', 'Y::show/$1/$1');
$routes->get('x/(:segment)/y/(:segment)/edit', 'Y::edit/$1/$1');
$routes->put('x/(:segment)/y/(:segment)', 'Y::update/$1/$1');
$routes->patch('x/(:segment)/y/(:segment)', 'Y::update/$1/$1');
$routes->delete('x/(:segment)/y/(:segment)', 'Y::delete/$1/$1');
i personly decide not follow sub resource source and url
(01-23-2021, 08:55 AM)nicojmb Wrote: [ -> ]Have you seen this addin?i tested it and i found is equlavent to my solution too now it 's up to which approaches i choose
https://github.com/tattersoftware/codeig...-relations