php - 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());
谢谢你的帮助!
解决方案
是时候为赏金猛扑过去了!:-) 我在这个线程中的答案的副本。
您的问题很可能与 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.php
Backpack 提供的文件,并替换$crud->route
为Route::getCurrentRoute()
或类似的东西 - 使用 Laravel 获取当前 URL 的方式,而不是$this->crud
. 这将使您的 AJAX 调用到当前 URL(而不是您为 CRUD 定义的 URL $this->crud->setRoute()
)。
老实说,我会推荐选项1。
推荐阅读
- node.js - Nodemon watch 触发 webpack 开发中间件重建
- php - 总结一个月的时间戳差异
- c - C中基于用户输入的动态增长数组
- docker - Docker 容器运行命令
- android - 来自本地数据存储的 Parse.com 离线查询返回 0 个对象
- javascript - 如何在 html 输入中获取模式
- python - 如何使用 python 通过 V1 API 向 Watson Assistant 技能发送和附加新的上下文变量?
- android - 在其他方法中调用改造并将结果返回到主线程
- visual-studio-code - TextMate 语法和主题如何与 VSCode 一起使用?
- sql - SQL Join BETWEEN 日期计数问题