(04-16-2020, 10:05 AM)emaidana Wrote: 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.
Thank you!
For some reason this is not described in the official documentation. I wanted to be able to reset only part of the query (for example only the Having clause, not the entire query) and to be able to clone the builder - in case I want to have to similar queries one after another.
For those who are about to encounter this issue:
Create a new folder in App\Database\MySQLi. Copy all files from vendor\codeigniter4\framework\system\Database\MySQLi there and delete their content - in case CodeIgniter gets updated, we wouldn't want to use old code.
Then open each file and replace the content with something similar to this one:
Code:
<?php
namespace App\Database\MySQLi;
use CodeIgniter\Database\MySQLi\Connection as BaseConnection;
class Connection extends BaseConnection {
}
Thats all!
Unfortunately it will work only for the MySQLi driver and I wanted it to work for the BaseBuilder class, but that's the limitation I'm willing to work with.
ps: If somebody is interested, here is my extended MySQLi/Builder class:
Code:
<?php
namespace App\Database\MySQLi;
use CodeIgniter\Database\MySQLi\Builder as BaseBuilder;
/**
* Builder for MySQLi
*/
class Builder extends BaseBuilder {
/**
* @param array $listOfPartsToReset
* Available options: select, join, where, group, order, limit, having
* @return Builder
*/
public function resetPartQuery(array $listOfPartsToReset): Builder {
foreach ($listOfPartsToReset as $item) {
switch ($item) {
case 'select':
$this->resetRun(['QBSelect' => []]);
break;
case 'join':
$this->resetRun(['QBJoin' => []]);
break;
case 'where':
$this->resetRun(['QBWhere' => []]);
break;
case 'group':
$this->resetRun(['QBGroupBy' => []]);
break;
case 'order':
$this->resetRun(['QBOrderBy' => []]);
break;
case 'limit':
$this->resetRun(['QBLimit' => false]);
break;
case 'having':
$this->resetRun(['QBHaving' => []]);
break;
}
}
return $this;
}
/**
* @param array $listOfPartsToReset
* @return Builder
*/
public function cloneBuilder(array $listOfPartsToReset = []): Builder {
$newInstance = clone $this;
return $newInstance->resetPartQuery($listOfPartsToReset);
}
}