繁体   English   中英

laravel 背包 ajax FetchOperation - 所有父母递归搜索

[英]laravel backpack ajax FetchOperation - search by all parents recursively

在我的 model AdGroup.php 我有:

public function parent() {
    return $this->belongsTo(AdGroup::class);
}

public function children() {
    return $this->hasMany(AdGroup::class, 'parent_id');
}

public function getTreeTitleAttribute() {
    $treeTitle = $this->title;
    if($this->parent) {
        $treeTitle = $this->parent->getTreeTitleAttribute() . ' > ' . $treeTitle;
    }
    return $treeTitle;
}

$model->treeTitle 返回 AdGoup 的完整标题,例如:Fruits > Red fruits > Strawberries

在 AdGroupCrudController.php 我有:

protected function setupCreateOperation()
{
    CRUD::setValidation(AdGroupRequest::class);
    
    $this->crud->addField([
        'label' => __('admin.parent'),
        'type' => 'relationship',
        'name' => 'parent_id',
        'entity' => 'parent',
        'attribute' => 'tree_title',
        'ajax' => true,
        'minimum_input_length' => 0,
        'allows_null' => true
    ]);
}

public function fetchParent()
{
    return $this->fetch([
        'model' => \App\Models\AdGroup::class,
        'query' => function($model) {
            return $model->orderBy('lft')->orderBy('id', 'ASC');
        } 
    ]);
}

这向我显示了一个 select2 下拉列表,它能够搜索所有类别并显示它们的树标题。 只有一个缺点 - 搜索无法正常工作。 它按标题(数据库列)搜索,而不是我在 model 中定义的 treeTitle 属性。 我知道这是因为 fetchParent 方法直接从 DB 中搜索,然后才在返回的结果中收到我的 treeTitle,但也许这可以解决? 我在 Laravel 背包文档上找到了一个扩展的 fetch 方法:

public function fetchUser() {
        return $this->fetch([
            'model' => User::class,
            'query' => function($model) {
                $search = request()->input('q') ?? false;
                if ($search) {
                    return $model->whereRaw('CONCAT(`first_name`," ",`last_name`) LIKE "%' . $search . '%"');
                }else{
                    return $model;
                }
            },
            'searchable_attributes' => []
        ]);
    }

也许可以扩展它以满足我的需求? 当我搜索背包数据表(列表)时,同样的问题仍然存在。

确实,您已经正确地指出了根本问题:

我知道这是因为 fetchParent 方法直接从 DB 中搜索,然后才在返回的结果中收到我的 treeTitle;

解决方案:您可以使用 Fetch 的query属性来自定义查询,并包含您的 treeTitle。 唯一的问题是……那么你必须在 SQL 中进行tree_title计算。 这并不容易。


或者,不要使用relationship字段和Fetch操作。 相反,您可以使用select2_from_ajax字段,它为自定义提供了更多空间

因为您创建自己的路线和 CrudController 来响应 AJAX 请求,所以在 controller 中,您可以

  • 手动搜索搜索词
  • 只保留 10 个结果
  • 然后只对这 10 个结果进行 PHP 处理

文档中的示例将提供一个很好的起点。

请注意,这样做有一个缺点:人们将无法搜索Fruits > Red Fruits ,他们只能搜索FruitsRed Fruits (一次一个) 但这可能是一个值得妥协的方案:这样做可以让您不必编写非常复杂的 SQL 查询和/或存储 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM