We needed an advanced search system in the recent project. This system included many filters that required a flexible and scalable search system.
...
For further actions, you may consider blocking this person and/or reporting abuse
Hi,
First of all thanks for your easy and great solution.
I found many solutions for eloquent search filters, but this is discrete :).
I felt that relational object filters were not discussed.
So here is my code for eloquent relational search, hope it will also help some one.
For relational object follow these steps:
I have two tables Profiles and Leads.
Each Profile has some Leads against it.
This is my coding style, please change this according to your code ethics.
// @$Profile is the instance of collection in my Controller function
$Profiles = $this->Profiles;
$Profiles= $this->ApplyFilters($Request, $Profiles)->get();
// Apply Filters to relational models
private function ApplyFilrers($Request, $Profiles){
foreach(request()->all() as $Key=>$Value){
// if($Key == “Category”){
$Profiles = $Profiles->whereHas(‘Leads’, function($Profile) use($Key, $Value){
// I have a CategoryFilter in my EloquentFilters\Leads
$Profile = EloquentBuilder::to($Profile, [ $Key=>$Value]);
});
//}
}
return $Profiles;
}
Thanks you for your kind words ;)
It was an interesting example.
Thank you for sharing.
Also if you want to implement a filter for a columns against multiple values.
For example following is the array you mentioned in example, but with gender filter as an array.
[
'age_more_than' => '25',
'gender' => ['male','female','custom']
'has_published_post' => 'true',
]
class GenderFilter extends Filter
{
}
Nice.
Type of the value parameter is mixed and you can set it to any value based on your requirement.
Thanks Dear @Farrukh
Thanks for your appreciation.
Hi,
Can we do sorting for eloquent relations?
Yes,you can.
EloquentBuilder return an instance of Builder:
Thanks a lot for your reply.
I did not try it yet. Hope it will work as I wish.
Regards
Hi,
I used laravel debugger, when I used Eloquent Builder it shows me a (lot) number of queries.
is it normal or there is some method to reduce that
Regards
Farrukh
Hi,
The EloquentBuilder reduces the complexity of the queries and conditions of the code.Number of queries is not related to it.
Good luck
Thanks a lot dear
Nice work man. You made a typo. According to the docs on GitHub github.com/mohammad-fouladgar/eloq...,
class AgeMoreThanFilter should extend Filter and not implement Filter
And EloquentBuilder::to() method should not be called statically. Am sure the package has been updated.
Thanks Bill, Yes The package has been updated.
Please read this article : dev.to/mohammadfouladgar/laravel-m...
thank you for your great solution
You're welcome. Good luck...
Seriously? Imagine if you have 15-20 filters, you will repeat the queries with if loop 20 times?
I think it's better than using complex terms. In this way we have better management of each filter.
Also, We observation to the single responsibility principle.
if you have a better way, please suggest. thanks a lot for your notice.
You can build the query with normal mysql syntax, then if you use a form, give the form name of the database field that you want to compare, and the value of the form input is the value you want to search for example 3, or some name. Then when the value returned is null, you normally don't take the field into the sql string. Its just some formatting you have to use in the controller, and its all automated, if the main purpose is directory listing or similar stuff
I suggest using the package once.
The query goes to the database only once.
Nice post. Btw your before and after example is the same, took me sometimes to realize this.
Edit : After sign in, the post display correct before and after, maybe a bug
Thanks!
I hope useful for you.
Maybe...,i don't know
Thank God, Love It
You're welcome! I'm glad to hear that.
Nice post! And how about this?
github.com/spatie/laravel-query-bu...
Thanks so much.
That package is also good.
My goal is to use it more easily and avoid any complexity too.
Also, for the better development of the source, used from design patterns such as the factory method and other concepts of OOP.
Nice post!
Can we combine two or more filter classes to single one.
If some filters have be a single responsibility you can manage them in a single filter class.Otherwise, you should define a filter-class for each filter argument.
You are welcome, Thank you 👍
@bpedroza Thank you for your noticing.
This block updated in GitHub repository.