首页 > 解决方案 > addClause 总是返回空集合

问题描述

Edit2:感谢@tabacitu,问题现在得到了解决。感谢所有试图提供帮助的人!在我更新问题时,请参阅此 github 线程以获取更多信息:https ://github.com/Laravel-Backpack/CRUD/issues/2049

User编辑:我只使用模型在全新的背包安装上尝试过这个。同样的问题。

在 和 处添加了以下路线routes/backpack/custom.php

Route::get('test/{id}', 'UserCrudController@index');

这是我的网址:https://example.com/admin/test/30

然后将以下代码添加到我的UserCrudController.php

$id = \Route::current()->parameter('id');        

现在再一次,这不起作用:

$this->crud->addClause('where','id', "=", $id); //produces empty result, but $id contains 30

但这确实有效:

$this->crud->addClause('where','id', "=", 30); //here I get my user with id 30.


我有一个Article模型,$this->crud->addClause('where','user_id',backpack_user()->id);用于将显示的文章限制为属于当前登录用户的文章。

我现在想通过仅显示具有特定内容page_id的文章来进一步过滤我的文章- 事实上,我可以毫不费力地做到这一点:

$this->crud->addClause('where','page_id', "=", "154");

现在只显示 apage_id为 154 的文章。

显然我想要 page_id 的动态变量,所以我的 url 看起来像这样

http://example.com/admin/articles/154

我像这样提取最后一个参数:

$segments = request()->segments();
$page_id = $segments[count($segments)-1]; //get last segment, contains "154"

现在我的问题是,出于某种晦涩的原因,每当我尝试使用

$this->crud->addClause('where','page_id', "=", $page_id);

该集合是空的,即使 dd()'ing$page_id显示它设置并包含“154”。我什至尝试像这样将 $page_id 转换为 int ,实际上它变成了 int 但仍然是同样的问题(空集合):

$page_id = (int)$segments[count($segments)-1]; //shows 154


编辑:以下是输出dd($this->crud->query->toSql());

//limit access to user owned models
$this->crud->addClause('where','user_id',backpack_user()->id);    
//produces "select * from `articles` where `user_id` = ?"
dd($this->crud->query->toSql());

//limit entries to those with samge page_id as in URL
$page_id = \Route::current()->parameter('page_id');
$this->crud->addClause('where','page_id',$page_id);       
//produces "select * from `articles` where `user_id` = ? and `page_id` = ?"
dd($this->crud->query->toSql());

谢谢你的帮助!

标签: phplaravellaravel-backpack

解决方案


是时候为赏金猛扑过去了!:-) 我在这个线程中的答案的副本。

您的问题很可能与 AJAX 数据表 URL 有关。它没有得到参数,所以它不应用它。

基本上:

  • /town_id/x路线指向Controller::index()
  • CrudController::index()只加载视图;
  • 视图告诉 DataTables 从url($crud->route.'/search').'?'.Request::getQueryString()路由中加载信息;这将不包括您的 town_id 参数;因为它使用$crud->route(); 中指定的setup(); 它不包括/town_id/x

解决方案 A

解决此问题的一种方法:

  • 而不是为它设置路由,而是使用 GET 参数:example.com/admin/users/?town_id=20
  • 您将能够获取该参数并将其应用到search()您的setup()方法中:
        if (\Route::getCurrentRoute()->getActionMethod() == 'search' && \Request::has('town_id')) {
            $this->crud->addClause('where', 'select', \Request::get('town_id'));
        }

解决方案 B

覆盖datatables_logic.blade.phpBackpack 提供的文件,并替换$crud->routeRoute::getCurrentRoute()或类似的东西 - 使用 Laravel 获取当前 URL 的方式,而不是$this->crud. 这将使您的 AJAX 调用到当前 URL(而不是您为 CRUD 定义的 URL $this->crud->setRoute())。


老实说,我会推荐选项1。


推荐阅读