Giter Site home page Giter Site logo

tucker-eric / eloquentfilter Goto Github PK

View Code? Open in Web Editor NEW
1.7K 42.0 118.0 361 KB

An Eloquent Way To Filter Laravel Models And Their Relationships

Home Page: http://tucker-eric.github.io/EloquentFilter

License: MIT License

PHP 100.00%
model-filters eloquent-filters dynamic-filters relation-filter laravel eloquent filter-logic eloquent-models filter query

eloquentfilter's People

Contributors

aurewill avatar bitdeli-chef avatar bobbypiper avatar dacoto97 avatar dependabot[bot] avatar designvoid avatar droplister avatar her-cat avatar hungkin avatar imanolympic avatar kanidjar avatar levitarr avatar lorenzosapora avatar mouadziani avatar mrwogu avatar owenvoke avatar pushpak avatar serderovsh avatar snowlyg avatar specialtactics avatar tucker-eric avatar yoyomo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eloquentfilter's Issues

Does this work with Laravel 5.2 or is there a tag I can use that does?

My app is Laravel 5.2 and so far all calls to Model::filter($request->input()) are returning all the models.

Notice I have to use $request->input() as $request->all() does not work in Laravel 5.2.

If there is a version of EloquentFilter that works with Laravel 5.2 please let me know or if it is known to require a higher version of Laravel.

thanks.

There is a way to filter a related model which have the same fields ?

Hi Eric:
Thanks for your excellence lib.
just like I mention in the title,
what if the Client model and the User model both have a filed named 'title',

class UserFilter extends ModelFilter
{
    public $relations = [
        'clients' => ['title', 'potential_volume'],
    ];
}
public function title($title)
{
   return $this->whereLike('title', $title);
}
}

class ClientFilter extends ModelFilter
{
    public $relations = [];

 public function title($title)
{
   return $this->whereLike('title', $title);
}
    
}

How can they work?

OR relation

Hi there, is it possible to add relation conditions using OR not AND?
I have:

        $this->where('name', 'LIKE', '%' . $text . '%')
            ->orWhere('excerpt', 'LIKE', '%' . $text.'%')
            ->orWhere('details', 'LIKE', '%' . $text.'%');
        $this->related('format', 'name', 'LIKE', '%' . $text.'%');
        $this->related('primaryFormat', 'name', 'LIKE', '%' . $text.'%');
        $this->related('meta', function ($query) use ($text) {
            return $query->where('key', 'film_synopsis')->where('value', 'LIKE', '%' . $text.'%');
        });

Which add the relation conditions on but as AND and it would like it all to OR... Hope that makes sense?
Cheers!

Logical operator OR instead of AND

Hello guys,
Very nice package, I'm coming from a RoR environment where filters are there out of the box, I really needed them here also.
My issue is more like a question: is it possible to use the OR logical operator between queries instead of AND?

Thank you,
Lilian

Improvement

I think it will be useful if the filterInput function changed as following,

ModelFilter.php

    public function filterInput()
    {
        foreach ($this->input as $key => $val) {
            // Call all local methods on filter
            $method = $this->getFilterMethod($key);

            if (method_exists($this, $method)) {
               /* $this->{$method}($val);*/
               $this->{$method}($val ,$this->input );

            }
        }
    }

then the example filter function would like bellow. inside that function, for an example, we can write any condition that id depends on other args parameters

class UserFilter

    public function company($id,$args)
    {
       //conditoins 
        return $this->where('company_id', $id);
    }

Fuzzy searching

Hi Eric,

First, just want to thank you for making this wonderful piece of software.

Just want to ask for insights on how to implement fuzzy searching within the defined filters.

Thanks in advance!

Regards,

Junel

Ability to order results

Hi,
This is a great package and it is really helping my project.
One thing I miss is the ability to order results based on query parameters.

Any thoughts?

How to set relation with namespace?

I have two Models.

class Member extends Authenticatable
{
    use Notifiable;
    use EloquentImageMutatorTrait;
    use Filterable;

    public function modelFilter()
    {
        return $this->provideFilter(MemberFilter::class);
    }
    public function evaluation ()
    {
        return $this->hasOne('App\MemberEvaluation','member_id','id');
    }
}

class MemberEvaluation extends Model
{
    use Filterable;

    protected $fillable = [
        'member_id',
        'score',
    ];

    public function modelFilter()
    {
        return $this->provideFilter(MemberEvaluationFilter::class);
    }
}

And I made two filters with namespace:

namespace App\ModelFilters\MemberFilters;

use EloquentFilter\ModelFilter;

class MemberFilter extends ModelFilter
{
    public $relations = [
        'MemberFilters\MemberEvaluation' => ['score_min'],
    ];
}

use EloquentFilter\ModelFilter;

class MemberEvaluationFilter extends ModelFilter
{
    public $relations = [];

    public function scoreMin($value)
    {
        return $this->where('score', '>=', $value);
    }
}

But it will get this error,

Call to undefined method Illuminate\Database\Query\Builder::MemberFilters\MemberEvaluation()

How can I set $relations in MemberFilter?

Use filter set up in relationship's filter

I'm trying to filter my cases model by patient, in which both have their own filters respectively. In my patient filter, I have the following filter I'd like to re-use if possible:

class PatientFilter extends ModelFilter
{
    public function name($name)
    {
        return $this->where('first_name', 'LIKE', DB::getPdo()->quote($name . '%'))
            ->orWhere('last_name', 'LIKE', DB::getPdo()->quote('%' . $name . '%'))
            ->orWhereRaw('concat([first_name], \' \', [last_name]) LIKE ' . DB::getPdo()->quote('%' . $name . '%'));
    }
}

I'm trying to access this filter from within my CaseEntityFilter class so I can pass something like patient_name as a filter on the case and return cases matching the patient name.

Here's what I've tried for the filter on cases, but to no luck:

class CaseEntityFilter extends ModelFilter
{
    // Cant seem to get this to point to the method on the actual filter
    public $relations = [
        'patient' => [
            'name',
            'firstName',
            'patient_name'
        ]
    ];

    // Produces 'invalid column' error
    public function patientName($name)
    {
        return $this->related('patient', 'name', $name);
    }

My database (SQL Server) throws an error about the column name not existing (which it rightfully doesn't). I can't seem to figure out how to execute the name() method on my patient's filter instead of just querying for the column 'name'.

I'm new to Laravel so is there something I'm missing or would this be considered a feature request?

Thank you for the excellent plugin by the way! :)

1.3.2 update breaks

HI,

I updated to version 1.3.2 and i have this error:

FatalErrorException in ModelFilter.php line 571:
Call to undefined method Illuminate\Database\Eloquent\Relations\Relation::hasMacro()
in ModelFilter.php line 571

at Application->handleShutdown() in RegistersExceptionHandlers.php line 55
at Application->Laravel\Lumen\Concerns{closure}()

forcing the version to 1.3.1 in composer.json solve the error.

BelongsToMany and paginateFilter() destroys pivot

When using the method paginateFilter() on a model with pivot table, this pivot table is not present inside the model. When changing back to paginate() the pivot model is back.

companies - company_user - users

In this case, if I would get all the users inside a company, and there would be any additional data inside the pivot table, it would be added inside the 'relations' object inside the model, but this is not present.

Enhancement request / question: Eloquent orderBy option

Hi Eric.
Thanks for this powerful Filter tool!
Is there a possibility to add an orderBy option to the filter?

Something like this:

?title=lorem&sort:title&direction:asc

Which automatically adds ->orderBy('title', 'asc') to the filter query.

Kind regards
Mathias

Filtering on another database table

I am struggling to create a filter that uses a table "content_features" from another database "sac_repo_db".

If the user doesnโ€™t select a filter the query is created correctly:

SELECT 'purchased_contents'.'id', 'purchased_contents'.'title', 'purchased_contents'.'description', 'sac_repo_db'.'content_features'.'content_type' FROM 'purchased_contents' inner join 'sac_repo_db'.'content_features' on 'purchased_contents'.'content_feature_id' = 'sac_repo_db'.'content_features'.'id' WHERE 'content_type_id' > '0'

However when a filter is applied the query omits the reference to the other database:

select 'purchased_contents'.'id', 'purchased_contents'.'title', 'purchased_contents'.'description', 'sac_repo_db'.'content_features'.'content_type' from 'purchased_contents' inner join 'sac_repo_db'.'content_features' on 'purchased_contents'.'content_feature_id' = 'sac_repo_db'.'content_features'.'id' where exists (select * from 'content_features' where 'purchased_contents'.'content_feature_id' = 'content_features'.'id' and 'content_type_id' in (6))

What it should create is this:
select 'purchased_contents'.'id', 'purchased_contents'.'title', 'purchased_contents'.'description', 'sac_repo_db'.'content_features'.'content_type' from 'purchased_contents' inner join 'sac_repo_db'.'content_features' on 'purchased_contents'.'content_feature_id' = 'sac_repo_db'.'content_features'.'id' where exists (select * from 'sac_repo_db'.'content_features' where 'purchased_contents'.'content_feature_id' = 'sac_repo_db'.'content_features'.'id' and 'content_type_id' in (6))

I realise this is rather a complex question, but I think I am probably missing something fairly simple to get the filter to construct the correct query. It works fine if I use
Any help would much appreciated.

PurchasedContentTableController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;
use App\ModelFilters\PurchasedContentFilter;
use App\PurchasedContent;


class PurchasedContentTableController extends Controller
{
    public function filteredIndex(Request $request)
    {
        return PurchasedContent
            ::select('purchased_contents.id', 'purchased_contents.title', 'purchased_contents.description', 'sac_repo_db.content_features.content_type')
            ->join('sac_repo_db.content_features', 'purchased_contents.content_feature_id', '=', 'sac_repo_db.content_features.id')
            ->filter($request->all())->get();
    }
}

PurchasedContentFilter.php

<?php
namespace App\ModelFilters;

use EloquentFilter\ModelFilter;

class PurchasedContentFilter extends ModelFilter
{
    public $relations = [
    ];

    public function contentFeatures($content_type_ids)
    {        
        if ( count($content_type_ids) > 0 ) {
            return $this->whereHas('contentFeature', function($query) use ($content_type_ids)
            {
                return $query->whereIn('content_type_id', $content_type_ids);
            });
        }

        return $this->where('content_type_id', '>', 0);
    }
}

PurchasedContent.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use EloquentFilter\Filterable;

class PurchasedContent extends Model
{

    use Filterable;

    protected $guarded = ['id', 'created_at', 'updated_at'];

    protected $dates = ['purchased_at', 'created_at', 'updated_at'];

    public function modelFilter()
    {
        return $this->provideFilter(ModelFilters\PurchasedContentFilter::class);
    }

    public function contentFeature()
    {
        return $this->belongsTo('App\RepoModels\ContentFeature');
    }
}

ContentFeature.php

<?php

namespace App\RepoModels;

use Illuminate\Database\Eloquent\Model;

class ContentFeature extends Model
{
    
    protected $connection = 'mysql_repo';

    protected $guarded = ['id', 'created_at', 'updated_at'];

    protected $dates = ['created_at', 'updated_at'];


    public function contents()
    {
        return $this->hasMany(Content::class);
    }
}

Using Passport with EloquentFilter

Hi Eric,

Just a quick question, can Laravel Passport work with EloquentFilter and how do you go about it?

Thanks a lot for any input.

Regards,

Junel

Does this support lumen 5.4 ?

Does this support lumen 5.4 ?

i get error

PHP error:  Call to undefined function EloquentFilter\config_path() in i/vendor/tucker-eric/eloquentfilter/src/ServiceProvider.php on line 17

Using the same $relations values across associated ModelFilters causes PHP Memory Allocation Error

If I setup 2 ModelFilters that pass data using the $relations class property I it causes an infinite loop where it keeps passing data between each ModelFilter (unconfirmed). The error being returned is "PHP Fatal error: Allowed memory size of 134217728 bytes exhausted".

I can use different key names (like a_active, b_active). I could also use the other method for relationships but ideally I'd just like to pass 'active'.

For example consider these ModelFilters which would be related to 2 Models both with a relationship with one another.

class A extends ModelFilter
{
    public $relations = [
        'b' => ['active']
    ];

    public function active() {
        return $this->where('active', $value);
    }
}

class B extends ModelFilter
{
    public $relations = [
        'a' => ['active']
    ];

    public function active() {
        return $this->where('active', $value);
    }
}

Any ideas?

Nested where not working

This is my filter:

public function search($search)
	{
		return $this->where(function($q) use ($search)
		{
			return $q->where('description', 'LIKE', "%$search%")
			         ->orWhere('title', 'LIKE', "%$search%");
		});
	}

But this is the query that's being run:

select `listings`.*, (select count(*) from `media` where `listings`.`id` = `media`.`model_id` and `media`.`model_type` = 'App\Listing') as `media_count` from `listings` where (`description` LIKE 'App\Listing' or `title` LIKE '%a%') and `category_id` = '%a%' limit 2 offset 0

For some reason, the first instance of $search is returning the classname of the model instead of the search term that's being passed through the query string. I'm unsure if I've just set this up incorrect or if it's a bug.

how handle request contain array

In my filter request contain array such as address[region] and address[city] ..
and my ModelFilter how handle these input and write query?

How can I drop _id in the name of my column

screen shot 2018-04-12 at 10 14 45

Hi Eric congratulations for your cool lib, I've had a little problem with the name of the column 'Propiedad.comuna_id' because in my table its name is 'Propiedad.comuna' , How can I resolve this issue, I've read that $drop_id=false in my model filter can be drop _id but I think that I understood bad.
if I change its name to 'propiedad.comuna_id', it works fine, but I have advanced my project and I can't change all the tables.

thanks for your help.

Relationship ID based filtering

First off, this package is amazing, appreciate all the hardwork! Really is helping me out.

I'm trying to using filtering on top of api endpoints for specific models. For example I would call this endpoint:
/api/instructor/10/classes

That endpoint would pull only the classes associated with that instructor, but I want to be able to add filter such as:
/api/instructor/10/classes?start=2018-08-15&end=2018-08-17

My code currently for the api endpoint controller looks like this:

public function index($id)
{
        $instructor = Instructor::findOrFail($id);
        $classes = $instructor->classes();

        return (new InstructorClassesResource($classes))->response()->setStatusCode(200);
 }

But wondering how would I implement the filter on top of the findOrFail by id? Would I have to pass a parameter to the setup function?

Would appreciate guidance! Thank you

Arrays as multiple filters

It seems that utilizing arrays does not account for the case that you may want to apply the same filter multiple times. Instead of calling the filter once with an array as the input, how can we achieve calling the filter multiple times with each input being one item in the array?

Filtering polymorphic relation

Hi there,

First, thanks for this package as it ease the filtering process nicely!

Second, I've got the following case and require assistance :
A Bill or Invoice if you prefer:

class Bill extends Model
{
    use Filterable;

    public function modelFilter()
    {
        return $this->provideFilter(BillFilter::class);
    }

    public function billable()
    {
        return $this->morphTo();
    }
}

Links to a "billable" something that may have a bill, for the example let's say an order that's been place by a customer:

class Order extends Model
{
    use Filterable;

    public function modelFilter()
    {
        return $this->provideFilter(OrderFilter::class);
    }
   
    public function buyer()
    {
        return $this->belongsTo(Customer::class, 'buyer_id');
    }

    public function bill()
    {
        return $this->morphOne(Bill::class, 'billable');
    }
}

As you can see the order reference a buyer which I would like to filter on via its name when filtering a bill list.

As the Customer filter already exists I tried with the $relations array as so in BillFilter:

    public $relations = [
        'billable' => [ 'customer' ],
    ];

and in OrderFilter I've got the following filter method:

    public function customer($name)
    {
        return $this->whereLike('name', $name);
    }

Thing is it seems that the filterRelations methods goes into an infinite loop in that case. Other test I did was create a "normal" relationship on Bill as so to try if the $relations was setup right:

    public function order()
    {
        return $this->belongsTo(Order::class, 'billable_id');
    }

Which worked as expected.

Would it be possible to filter with the polymorphic relation or not ? And am I doing it wrong ?

Return only certain fields

Hi again,
Is it possible to return just some selected fields? Like User::get(['first_name','last_name','email']);
There are some cases when I want to hide some fields when searching (like a public search) and I cannot use the protected $hidden attribute to specify those fields because in other situations I need those fields to be shown by default.
Thanks for this awesome package.
Lilian

Model scope methods are not working well

I have a strange issue somehow scope methods are giving strange results.

In User model there is scope function with name active

    public static function scopeActive()
    {
        return static::whereIsActive(1);
    }

So if I do

 User::active()->filter($request->all())->latest()->paginate(20);

In Filter Class

    public function q($username)
    {
        return $this->whereUsername($username); // No Additional check is set
    }

I also get User which are not active.

But

If I do

User::filter($request->all())->latest()->paginate(20);

In filter class

    public function q($username)
    {
        return $this->whereIsActive(1)->whereUsername($username); // Additional check is set
    }

Results are correct.

Using different comparisons

Is there a recommended way to use different comparison operators? For example, if I wanted to filter potential_volume is <, > or =. In the examples in the documentation, the comparison operator is implied in the function. Perhaps something like this:

[
  'potential_volume' => '>100',
  'name' => 'james%'
]

is there a way to specify which query parameters to use when using paginateFilter()

I have a situation where I am passing an array of values to filter() which includes a "sorting" parameter

but it so happens that my "sorting" parameter is not a url query parameter, instead it's part of my route

So my route looks like /submissions/latest?page=2

And I pass

[
    "sorting" => $routeParams["sorting"],
    "page" => $queryParams["page"],
]

The filter does its job properly, but then because I'm using paginateFilter

The url produced by the paginator is /submissions/latest?sorting=latest&page=3

How can I tell paginateFilter to not use everything passed to the filter() but only use parameters I whitelist?

How to execute laravel WHERE clause along with EloquentFilter

When i use this controller it works

public function indexArtisan(Request $request)
{
    $workers = Worker::filter($request->all())->get();
    $states = DB::table('states')->pluck("name", "id");
    return view ('artisans', compact('states'))->with(['workers' => $workers]);
}

but when i use this

public function indexArtisan(Request $request)
{
    $work = DB::table('workers')->where('career', '=', 'artisan')->get();
    $workers = Worker::filter($request->all())->get();
    $states = DB::table('states')->pluck("name", "id");
    return view ('artisans', compact('states','work'))->with(['workers' => $workers]);
}

it doesnt work. Any ideas on what to do?

Dynamic namespace for modular app

Is there a way I can set the namespace dynamically for a modular app?

I am currently using the nwidart/laravel-modules package to separate my application. Some of my modules have a their own separate search facility so the question here is, is there a way I can the namespace for each module dynamically?

THanks

Dot notation in key name

I'm passing through the following search criteria, but it's only searching by my name "Ben", the company name is being ignored. How do I use dot notation?

[
    'Name'  => 'Ben',
    'Company.Name'  => 'Nike',
]

Here's my PHP code:

// works
public function name($value)
{
    return $this->where('Name', 'LIKE', "%$value%");
}

// ignored
public function companyName($value)
{
    return $this->related('company', 'Name', 'LIKE', "%$value%");
}

does not work with hybridrelations between mysql and mongodb relationships

I know this is probably outside the scope of your project but I think it would be really cool if I could get it to work.

I'm using https://github.com/jenssegers/laravel-mongodb which supports hybrid relations between mysql and mongodb models.

I am able to do this no problem User::with('profile')->all();

Where User is a mysql model and Profile is a mongodb model

Furthermore your Filterable trait works out of the box on the mongodb model which is great and I am having a lot of enjoyment using it!

so $users = User::filter($request->get()) and $profiles = Profile::filter($request->get()) both work great.

But if I try to do $users = User::filter(['gender' => 'male'])->get(); then I get errors and the errors are basically showing that it is looking for the profile fields inside mysql instead of making those queries on the mongodb collection.

I've set up my models properly

My User model uses a UserFilter which has

    public function gender($value)
    {
        return $this->where('gender', $value);
    }

And my ProfileFilter has

    public function gender($value)
    {
        return $this->where('gender', $value);
    }

And I've confirmed that the gender function above DOES get called. But when it does I get this error

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'exists ? and `user_id` <> ? and `main_picture` is not null and `gender` = ?)' at line 1 (SQL: select * from `users` where exists (select `user_id` from `profile` where `user_id` exists 1 and `user_id` <> 201 and `main_picture` is not null and `gender` = male))

Basically it's ignoring my HybridRelations setup and assuming that Profile is another mysql model.

The fact that your EloquentFilter DOES work on my mongodb model when used without a relation tells me that this can probably be made to work without too much difficulty.

Is there any chance you could add this functionality or put me in the right direction?

I have a feeling part of the answer might lie in https://github.com/jenssegers/laravel-mongodb/blob/master/src/Jenssegers/Mongodb/Eloquent/HybridRelations.php

Many thanks!

Add orWhereLike method

The package has whereLike, but no orWhereLike. It's a small feature request. ๐Ÿ˜„

Just a heads up

I just did a test upgrade to L5.4 and your package caused a few errors. I'm not going to be working on the latest version for my current project so don't have time at the mo to fix and submit a PR but figured I'd give you a heads up!

Using OR relation

I read the previous issues regarding using an OR relation - I've been able to make this work. The issue I've run into is applying the orWhere() only after the first filter. I'm including an attribute in the request to indicate whether or not the user would like all the filters to apply as OR or AND. However in order to make this work, the first filter needs to be a where() and the subsequent ones should use orWhere().

config directory changed

when I try to create a config file, artisan creates in the app folder, whereas the readme states:

Where User is the Eloquent Model you are creating the filter for. This will create app/ModelFilters/UserFilter.php

I tried a second time to run the command to make sure (using the command in readme - php artisan model:filter User) and got:

php artisan model:filter User

/Users/robbielove/dev/xxxxxx/app/UserFilter.php Already Exists!

this is starting to really confuse me about where the file should be located, in saying this - i have tried using it in both app/UserFilter.php and app/ModelFilters/UserFilter.php and still get variations of

Class 'App\ModelFilters\UserFilter' not found

the newly generated UserFilter contains:


use EloquentFilter\ModelFilter;

class UserFilter extends ModelFilter
{
    /**
    * Related Models that have ModelFilters as well as the method on the ModelFilter
    * As [relatedModel => [input_key1, input_key2]].
    *
    * @var array
    */
    public $relations = [];
}

I have tried with and without adding modelFilter() to my user model. nothing I do seems to get it working, I tried with just an orderby() method in-case my code was causing the class not to be created, but still same error.

Vendor publish is not doing anything

Since the update, I am not able to publish the configuration file with a new laravel installation.

I have the service provider in my app.php, but its not doing anything.

php artisan vendor:publish --provider="EloquentFilter\ServiceProvider"

Filter by aggregations

Hi.

Somhow I couldn't find any info on the topic of filtering by aggregates, so here's my quesion. I have two models: Group -{has many}-> Student. I would like to filter all groups with average student age more then Y (age is a calculated field, e.g. AVG(TIMESTAMPDIFF(YEAR, person.dob, NOW())) AS age)

I am pretty new to Laravel in general, so sorry if this is not a question about filters exactly.

Thanks in advance for your help.

how to filter belongsToMany relation

how to filter belongsToMany relation ?

TalentFilter :

public function skills($ids)
{
    is_string($ids) ? $ids = explode(',', $ids) : $ids;

    $this->related('skills', function($query) use ($ids) {
        return $query->whereIn('skill_id', $ids);
    });

}

Talent Model :

public function skills()
{
    return $this->belongsToMany(Skill::class);
}

Filters only effect initial query ... expected behaviour?

Hello again,

I've got (perhaps) an issue but I'm just hoping to conclude this is the expected behaviour or something is wrong / missing in my codebase.

Consider this combination of ModelFilter example.

class ParentFilter extends ModelFilter
{
    public $relations = [
        'childModel' => ['active']
    ];
}

class ChildFilter extends ModelFilter
{
    public $relations = [];

    public function active($value) {
        return $this->where('active', $value);
    }
}

On the initial query it creates an "exist" sub-query and checks it can find atleast 1 child which is 'active'.

select * from `parent_table`
where `uuid` = ?
and exists
    (select * from `children_table`
    where `parent_table`.`parent_id` = `children_table`.`parent_id`
    and `active` = ?
    and `children_table`.`deleted_at` is null)
and `parent_table`.`deleted_at` is null
(
    [0] => 3f151f53-935a-4577-af5b-ed6669524ad3
    [1] => 1
    [2] => 1
)

Then inevitably my code attempts to grab the children from the parent (e.g. ParentTable->childrenTable). And the code runs this query:

select * from `children_table`
where `children_table`.`parent_id` in (?)
and `children_table`.`deleted_at` is null
(
    [0] => 601
)

Notice how the second query does not have an 'active' = 1 where clause.

Is this the expected behaviour or do I need to take an additional steps to ensure the ParentTable->childrenTable is properly filtered ( could this relate to the Model::with method? ).

Thank you in advance and for also promptly answering my other issue yesterday.

No Method Name Validation or Whitelist

At the moment, no validation or normalisation runs in the filterInput function. i.e. any key present in the input array will call a function with that name. This means any method can be called arbitrarily. For example, using the implementation as discussed in the readme, if one defines any (public or protected) function (e.g. superSecretMethod), then this could be called by visiting the appropriate endpoint with 'super_secret_method' as a query argument.

This is unlikely to cause a major security issue, since no actions should really be defined within a Filter, and the output of the function is never returned to the user, however I don't think arbitrary method calls are a good idea.

Some possible solutions:

  • create a whitelist of possible filters (i.e. require a parameter or function to be defined which specifies all the available filters)
  • come up with a common naming scheme for filters (e.g. get{FILTER_NAME}Filter, ร  la getFooAttribute)

/**
* Filter with input array.
*/
public function filterInput()
{
foreach ($this->input as $key => $val) {
// Call all local methods on filter
$method = $this->getFilterMethod($key);
if (method_exists($this, $method)) {
$this->{$method}($val);
}
}
}

[ASK] problem with column prefix

i have success use this lib with normal table,

so i have table, with prefix column, how to define primary column or how to change default sort column

Filter with paginator

Really, really good package, using it in a big project now and i'm loving it.

One thing I would like to notice, that you might want to add to the documentation, is the paginator.

When you render the default laravel paginator, the GET values in the URL will drop when you switch to another page, I have resolved this by rendering the paginator this way:

{!! $pages->appends(Input::except('page'))->render() !!}

This would generate URL for example:

app.com/pages?title=PageTitle&page=3

(Otherwise, the paginator would override the filter options and clear it from the url so you would loose your filter)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.