• 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Extends Database Library

#1
Hello,

I'm trying to extend the database library in order to "prepare" all the queries (raw and generated by builder); in this method I'll take care of virtual views names replacement. 

For example this query:

Code:
SELECT 1 FROM @[email protected] LIMIT 10;

Will turn into this:

Code:
SELECT
    1
FROM
    (
        SELECT
            id, name, address
        FROM
            users
        WHERE
            status='active'
    ) AS vw_users
LIMIT 10;

Based on this definition:

PHP Code:
$views["vw_users"] = 
"
    SELECT
        id, name, address
    FROM
        users
    WHERE
        status='active'
"


I already read the answer posted by kilishan at https://forum.codeigniter.com/thread-741...#pid366477 but I can't resign myself to that.

How can I achieved this like I did it in CI3 extending core classes?

Regards.
Reply

#2
You're on your own for now! If you come up for an elegant solution, please share it Smile There are plans to rework the database layer, likely with support for NoSQL and to make extensions easier, but for now there is no easy way to do this.
Reply

#3
Hello,

After several attempts, the only way it works is extending all the MySQLi driver like kilishan says in his referenced reply. Here I show some code detail of my solution.

I created a folder "MySQLi" inside App/Database, and then created all the files listed (extending the original driver provided):
  • Builder.php
  • Connection.php
  • Forge.php
  • PreparedQuery.php
  • Result.php
  • Utils.php
As example, this is the Builder.php file content:

PHP Code:
<?php namespace App\Database\MySQLi;

use 
CodeIgniter\Database\MySQLi\Builder as BaseBuilder;

/**
* Builder for MySQLi
*/
class Builder extends BaseBuilder
{



Particularly I just needed to customize the "execute" and "query" method in Connection.php file. All the other files stays same as the original one (by extending of course, like Builder.php example), but I must be present at the same folder.

The last step is to point the database driver to the defined in \App\Database\MySQLi.

The file to edit is App/Config/Database.php, it also works with the .env file.

PHP Code:
'DBDriver' => '\App\Database\MySQLi'


Regards.
Reply


Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


  Theme © 2014 iAndrew  
Powered By MyBB, © 2002-2020 MyBB Group.