spatie / laravel-query-builder

Easily build Eloquent queries from API requests
https://spatie.be/docs/laravel-query-builder
MIT License
4.05k stars 398 forks source link

Use filter with Lumen #224

Closed jcharcosset closed 5 years ago

jcharcosset commented 5 years ago

PHP version : 7.3.2 Lumen : 5.8.2 Laravel-query-builder : 1.17.0

Requesting relations work correctly but filtering and sorting doesn't work. I use config default file. I use lumen with Eloquent. I add request helper in helpers file.

My model :

class User extends Model implements AuthenticatableContract, AuthorizableContract
{
    use Authenticatable, Authorizable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];

    /**
     * Get all of the friends for the user.
     */
    public function friends()
    {
        return $this->belongsToMany(User::class, 'user_users', 'user_id', 'friend_id');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function getFriendsAttribute()
    {
        return $this->friends();
    }
}

In my controller :

        $users = QueryBuilder::for(User::class)
            ->allowedFilters('name')
            ->get();

And result :

explode() expects parameter 2 to be string, array given
--
in QueryBuilderRequest.php line 71
at Application->Laravel\Lumen\Concerns\{closure}(2,  'explode() expects parameter 2 to be string, array given',  '/Users/jcharcosset/Projects/lumen/vendor/spatie/laravel-query-builder/src/QueryBuilderRequest.php',  71, array('fields' => array('name' => 'John')))

My other case, from controller :

$users = QueryBuilder::for(User::class)
            ->allowedSorts('name')
            ->get();

Result :

Call to undefined method App\User::getNameAttribute()
jcharcosset commented 5 years ago

It's ok.

I added to bootstrap/app.php :

$app->register(Spatie\QueryBuilder\QueryBuilderServiceProvider::class);
$app->configure('query-builder');

And copy config file :

cp vendor/spatie/laravel-query-builder/config/query-builder.php config/

Sorry for inconvenience