我正在用Laravel构建一个RESTful API,我正在尝试开发一个功能,它允许基于URL参数向我的数据库模型发送复杂的查询。
我发现了一个很有前途的存储库,它似乎实现了想要的功能。https://github.com/heroicpixels/filterable
我很难理解包装器和特性。我像文档class Event extends Filterable {}
中提到的那样扩展了我的模型。但是我不知道如何正确实现FilterableTrait和FilterableWrapper。
当我将use FilterableTrait
放入我的类中时,我得到一个错误说
Heroicpixels'Filterable'Filterable和Heroicpixels'Filterable'FilterableTrait在App'Event的组合中定义了相同的属性($ Filterable)。这可能是不兼容的,为了提高可维护性,可以考虑在trait中使用访问器方法。类组成
目前我的事件模型看起来像这样
<?php namespace App;
use Illuminate'Database'Eloquent'Model;
use Illuminate'Database'Eloquent'SoftDeletes;
use Carbon'Carbon;
use Heroicpixels'Filterable'Filterable;
class Event extends Filterable {
/*
use FilterableTrait;
*/
protected $dates = ['deleted_at','starts_at','ends_at'];
protected $fillable = [
'deleted_at',
'locale',
'sports_id',
'starts_at',
'ends_at',
'locations_id',
'creators_id',
'capacity',
'attendees',
'information',
'level',
'price',
'lat',
'lng'
];
protected $hidden = ['created_at','updated_at','deleted_at'];
public function creator() {
return $this->hasOne('App'User','id','creators_id');
}
public function scopeFuture($query)
{
return $query->where('starts_at', '>=', Carbon::now());
}
public function scopeFreespots($query)
{
return $query->where('capacity', '>', 'attendees');
}
}
我错过了什么?我如何实现Trait和包装器,使我的URL参数被用作查询参数?非常感谢你的帮助!
据我所知,你必须从三种方法中选择一种。
您正在尝试扩展Filterable类并使用该trait。如果你想使用trait方法,你必须扩展Eloquent类。
最好扩展Filterable类,因为该方法也在文档中使用。
我以前遇到过同样的问题。这就是我最后所做的。让你的API url看起来像这样
$url = /query?id=999&quantity=10&action=update&api=98546
在你的路由中创建一个路由,我使用闭包,例如
route::get('/query/{name}',function($name){
$modal = $name;
$params = Request::all();
});
//output products
{"id":"999","quantity":"10","action":"update","api":"98546"}
在你的控制器中,你可以使用switch case
来适应这个任何模型,并从url参数构建你的查询。