Laravel/OctoberCMS前端滤波器
我正在使用OctoberCMS,我已经创建了一个自定义组件。我正在尝试创建一个前端过滤器,以通过分配给它们的Laravel/OctoberCMS前端滤波器,laravel,eloquent,octobercms,octobercms-plugins,Laravel,Eloquent,Octobercms,Octobercms Plugins,我正在使用OctoberCMS,我已经创建了一个自定义组件。我正在尝试创建一个前端过滤器,以通过分配给它们的巡更来过滤包 这就是我目前所拥有的。问题是代码在packages表中查找旅行字段,而不是使用旅行关系。有人有什么想法吗 <?php namespace Jakefeeley\Sghsportingevents\Components; use Cms\Classes\ComponentBase; use JakeFeeley\SghSportingEvents\Models\Pack
巡更来过滤包
这就是我目前所拥有的。问题是代码在packages
表中查找旅行
字段,而不是使用旅行关系。有人有什么想法吗
<?php namespace Jakefeeley\Sghsportingevents\Components;
use Cms\Classes\ComponentBase;
use JakeFeeley\SghSportingEvents\Models\Package;
use Illuminate\Support\Facades\Input;
class FilterPackages extends ComponentBase
{
public function componentDetails()
{
return [
'name' => 'Filter Packages',
'description' => 'Displays filters for packages'
];
}
public function onRun() {
$this->packages = $this->filterPackages();
}
protected function filterPackages() {
$tour = Input::get('tour');
$query = Package::all();
if($tour){
$query = Package::where('tour', '=', $tour)->get();
}
return $query;
}
public $packages;
}
您正在寻找whereHas
方法。你可以找到关于。我不确定你的意见是什么。这也将返回一个集合,而不是单个记录。如果只需要一个结果,请使用->first()
而不是->get()
$package = Package::whereHas('tour', function ($query) {
$query->where('id', $tour);
})->get();
当提供筛选器输入时,尝试查询关系
这是一种方法
public $packages;
protected $tourCode;
public function init()
{
$this->tourCode = trim(post('tour', '')); // or input()
$this->packages = $this->loadPackages();
}
private function loadPackages()
{
$query = PackagesModel::query();
// Run your query only when the input 'tour' is present.
// This assumes the 'tours' db table has a column named 'code'
$query->when(!empty($this->tourCode), function ($q){
return $q->whereHas('tour', function ($qq) {
$qq->whereCode($this->tourCode);
});
});
return $query->get();
}
如果您需要支持分页、排序和任何其他过滤器,您可以像上面那样添加它们的属性。e、 g
protected $sortOrder;
public function defineProperties(): array
{
return [
'sortOrder' => [
'title' => 'Sort by',
'type' => 'dropdown',
'default' => 'id asc',
'options' => [...], // allowed sorting options
],
];
}
public function init()
{
$filters = (array) post();
$this->tourCode = isset($filters['tour']) ? trim($filters['tour']) : '';
$this->sortOrder = isset($filters['sortOrder']) ? $filters['sortOrder'] : $this->property('sortOrder');
$this->packages = $this->loadPackages();
}
如果您有一个更复杂的情况,比如ajax过滤表单或动态分区,那么您可以按需加载记录,而不是按每个请求加载记录
public function onRun()
{
$this->packages = $this->loadPackages();
}
public function onFilter()
{
if (request()->ajax()) {
try {
return [
"#target-container" => $this->renderPartial("@packages",
[
'packages' => $this->loadPackages()
]
),
];
} catch (Exception $ex) {
throw $ex;
}
}
return false;
}
// call component-name::onFilter from your partials..