Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel/OctoberCMS前端滤波器_Laravel_Eloquent_Octobercms_Octobercms Plugins - Fatal编程技术网

Laravel/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

我正在使用OctoberCMS,我已经创建了一个自定义组件。我正在尝试创建一个前端过滤器,以通过分配给它们的
巡更
来过滤

这就是我目前所拥有的。问题是代码在
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..