quyle92 liked this thread
Have a look at this:
http://laravel-recipes.com/recipes/50/creating-a-helpers-file
You can create a helpers file where you can throw random functions in.
@Gouvi When I tried to do that I run into the same issue as before. Because that function is a modified increment() function which resides in Vendor/Laravel/Framework/src/Illuminate/Query/builder.php
So when I'm running it in let's say your example of App\helpers.php using that function above, it will now error to:
Call to undefined method Illuminate\Database\Query\Builder::addperc()
Making custom methods of my own is not a problem but extending/copy/modifying from an existing core function method doesn't seem to work outside of that builder.php path.
Hopefully this helps, and not being at a computer makes it hard for me to verify, but I would do the following. I would create a class, either taking in the query builder instance or extending it. I would then create a service provider and swap out the underlying 'db' instance in the app. Additionally I would make sure I adjusted the DB facade to point to the newly created class. Then I would start making my customers i m functions and see if they as being surfaced on the facade/db in the IoC.
I'm travelling now with no laptop to try it on, but I'll check back. If you haven't figured it the problem and I can solve it like I'm thinking, I'll post the code. Good luck in the mean time!!
Ok, after a prolonged absence, here goes ;)
I did this all in a fresh install of L5.1
I created a file in the app folder (MyDBClass.php)
namespace App;
use Illuminate\Database\DatabaseManager;
use Illuminate\Database\Connectors\ConnectionFactory;
class MyDBClass extends DatabaseManager
{
public function __construct($app, ConnectionFactory $factory)
{
parent::__construct($app, $factory);
}
public function myFunction()
{
dd('here');
}
}
Then in my AppServiceProvider.php (under app/Providers), in the register() function, I added the following.
$this->app->singleton('db', function ($app) {
return new MyDBClass($app, $app['db.factory']);
});
And to test, I made a test console command, but you can use a closure as well. The code I used looked like this.
dd(\DB::myFunction());
Thinking about this, you could also create your own facade (still using the DB as your facade - see the app/config.php file) vs doing the app->singleton. This may be a more appropriate way, but both should work.
Hope this helps!
And re-reading this... you may want to just have a base Model. Since I'm unsure if you want a function on the DB facade (shown above) or if you want a function on all your models, I'll also show you how to make a function availabale to all your models. There's 1 of 2 ways...
Method 1: Class extension. Create a base model and make it abstract. (I made mine in the app folder)
namespace App;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
}
public function myFunction()
{
dd('inherited function');
}
}
Then all you need to do is extend the base model.
class User extends BaseModel {
}
Method 2: Trait. I created mine in the app folder again (SomeTrait.php)
namespace App;
trait SomeTrait
{
public function myFunction()
{
dd('function via trait');
}
}
Then to implement...
class User extends Illuminate\Database\Eloquent\Model {
use SomeTrait;
}
Hope this helps more :P
Good luck!
After some read I found this repository showing how to use the macro method of the builder. Is really simple and really clean, just create a Provider and register the macro withing the register method and call it directly by its name.
From the source:
namespace Kevinsimard\BuilderMacros\Providers;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\ServiceProvider;
class OrderByRandomServiceProvider extends ServiceProvider
{
/**
* {@inheritdoc}
*/
public function register()
{
Builder::macro('orderByRandom', function () {
$randomFunctions = [
'mysql' => 'RAND()',
'pgsql' => 'RANDOM()',
'sqlite' => 'RANDOM()',
'sqlsrv' => 'NEWID()',
];
$driver = $this->getConnection()->getDriverName();
return $this->orderByRaw($randomFunctions[$driver]);
});
}
}
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.
The community