TP6的before_select到底如何用,效果如何?
augushong opened this issue · 3 comments
augushong commented
TP6的数据库事件before_select是怎么用的,
研究了一下午,看了一下午源码,也没搞出来怎么用.
这个地方似乎需要返回结果集,比如select的结果,
但是如果使用select,又会触发before_select事件,最后进入死循环.
找了半天也没找到怎么用的,
Db::event('before_select', function (Query $query) {
$model = $query->where('sass_uid', Sass::getUid())->find();
// dump($sql);
// $query->where('sass_uid', Sass::getUid())->select();
// $list = Db::query($sql);
return [$model];
// return true;
});
复制代码
按照我的理解,只需要在事件里面操作query就可以了,
但是实际上,如果存在事件,就不会进行原有的查询,会把事件的返回当做结果集,这应该是不对的吧.
public function select(BaseQuery $query): array
{
$resultSet = $this->db->trigger('before_select', $query);
if (!$resultSet) {
// 执行查询操作
$resultSet = $this->pdoQuery($query, function ($query) {
return $this->builder->select($query);
});
}
return $resultSet;
}
改进,似乎只要把!
去掉就可以了
if (!$resultSet) {
改为
if ($resultSet) {
augushong commented
不对,应该直接去掉逻辑判断,把整个if去掉,
这样的话before_select
就变成了只是修改query
,返回值无效.
public function select(BaseQuery $query): array
{
$resultSet = $this->db->trigger('before_select', $query);
// if (!$resultSet) {
// 执行查询操作
$resultSet = $this->pdoQuery($query, function ($query) {
return $this->builder->select($query);
});
// }
return $resultSet;
}
shirne commented
应该是,你在事件中做了查询就返回,select中就不再做查询。
如果你只是对query添加了条件或其它,不需要返回值,系统会继续做查询操作并返回
liu21st commented
这个地方 我还是统一下规范吧 改成只能修改query对象 省的以后很多人滥用 而且还考虑到 不使用TP框架的情况