addClause始终返回空集合

时间:2019-09-02 07:14:35

标签: php laravel backpack-for-laravel

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");

现在仅显示page_id为154的文章。

很明显,我想要一个用于page_id的动态变量,所以我的网址看起来像这样

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);

该集合为空,即使$page_id的dd()显示它已设置为 并包含“ 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());

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

该是时候赏金了! :-)我在this thread中答案的副本。

您的问题很可能与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

覆盖Backpack提供的datatables_logic.blade.php文件,并用$crud->route或类似性质的文件替换Route::getCurrentRoute()-使用Laravel的方法获取当前URL,而不是$this->crud 。这将使您的AJAX调用当前URL(而不是您使用$this->crud->setRoute()为CRUD定义的URL)。


老实说,我会建议选择1。

答案 1 :(得分:1)

我正在安装backpack的演示并尝试过。我在#where it's dying df = pd.read_csv(reports_directory+'/download.csv', encoding="utf-8") df.to_sql(report_name.lower(), db.conn, index=False, if_exists="replace") 中对其进行了测试,一切都正确。

MonsterCrudController中的问号(?)无关紧要。

enter image description here

但是我的建议:

先尝试这个

dd($this->crud->query->toSql());

如果它对您不起作用,请确保跟踪您的$this->crud->addClause('where','id', "=", (int)$id); 变量。