规则

2020-11-05  by  

架构定义

规则本身用数组进行驱动。传入一组键值对,如果满足执行条件,则会执行代码对Sql进行修改。

使用方法

规则支持数组对象两种格式传入。

  1. 数组格式

     $rules = [
         "id" => $id
     ];
    
  2. 对象格式

     use PHPZlc\PHPZlc\Doctrine\ORM\Rule\Rules;
        
     $rules = new Rules([
             "id" => $id
         ]);
        
     //将规则对象作为新规则的初始规则
     $rules = new Rules($rules);
        
     //追加数组、规则对象进入规则
     $rules =  $rules->addRules([]);
    

全局规则

全局规则用于对SQL主结构进行干预。

(1)全局规则不允许覆写。

(2)全局规则在所有规则之前执行,决定SQL主结构。

  1. Rule::R_SELECT

    select部分进行修改,指定查询字段。

     $rules = [
        Rule::R_SELECT => 'sql_pre.id, sql_pre.name'
     ];
       
    //*的写法只支持主表
    $rules = [
       Rule::R_SELECT => 'sql_pre.*'
    ];
    
  2. Rule::R_JOIN

    join部分进行修改,指定连表查询。

     $rules = [
        Rule::R_JOIN => 'LEFT JOIN user u on u.id = sql_pre.user_id'
     ];
    

    注意: 运用此规则直接定义联结的表,此表可能无法被底层识别,可以通过ResultSetMappingBuilder参数手动绑定(不是必须)。

  3. Rule::R_WHERE

    where部分进行修改。

     $rules = [
       Rule::R_WHERE => "AND sql_pre.name = '张三'"
     ];
    
  4. Rule::R_ORDER_BY

    order_by部分进行修改。

    $rules = [
       Rule::R_ORDER_BY => 'sql_pre.name ASC,sql_pre.id ASC'
    ];
    
  5. R_HIDE_SELECT

    对查询的一些字段进行隐藏,在所有规则运行之后运行。

    $rules = [
       Rule::R_HIDE_SELECT => 'sql_pre.name, sql_pre.id'
    ];
    
  6. R_FREED_FALSE_DEL

    释放逻辑删除数据。

    $rules = [
       Rule::R_FREED_FALSE_DEL => 1,
    ];
    

字段规则

字段规则为表中的每个字段配套附属的规则。

规则由两部分组成,别名.规则名,当前表别名为sql_pre,可以忽略不写。

字段的属性名和字段名都可以识别。

  1. 字段名本身(绝对查询)

    生效条件

    无条件生效

    写法

    $rules = [
       'id' => '1'
    ];
    

    对应的sql资源

     AND sql_pre.id = '1'
    
  2. RA_NOT_REAL_EMPTY(不为空查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

    $rules = [
       'id' . Rule::RA_NOT_REAL_EMPTY => '1'
    ];
    

    对应的Sql资源

     AND sql_pre.id = '1'
    
  3. RA_LIKE(LIKE模糊查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

      $rules = [
         'name' . Rule::RA_LIKE => '%张三%'
      ];
    

    对应的Sql资源

      AND sql_pre.id LIKE '%张三%'
    
  4. RA_CONTRAST(比较查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

      $rules = [
         'id' . Rule::RA_CONTRAST => ['>', '1']   
      ];
    

    对应的Sql资源

      AND sql_pre.id > '1'
    

    如果需要两个比较,第二个比较可以使用RA_CONTRAST_2规则;使用方法同上。

  5. RA_IS(is 查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

      $rules = [
         'id' . Rule::RA_IS => "null"
      ];
    

    对应的Sql资源

      AND sql_pre.id is null
    
  6. RA_IN(in 查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

      use PHPZlc\PHPZlc\Doctrine\ORM\Untils\SQL;
        
      $rules = [
         'id' . Rule::RA_IN => SQL::in("1,2,3")
      ];
    

    对应的Sql资源

      AND sql_pre.id in ("1", "2", "3")
    
  7. RA_NOT_IN(not in 查询)

    生效条件

    如果规则值真不为空,则生效。

    写法

      use PHPZlc\PHPZlc\Doctrine\ORM\Untils\SQL;
        
      $rules = [
         'id' . Rule::RA_NOT_IN => SQL::in("1,2,3")
      ];
    

    对应的Sql资源

      AND sql_pre.id not in ("1", "2", "3")
    
  8. RA_JOIN (连表)

    生效条件

    如果规则值真不为空,则生效。

    写法

     $rules = [
        'user_id' . Rule::RA_JOIN => array(
           'type' => 'LEFT JOIN',  // 可选参数, 默认值为 'LEFT JOIN'
           'tableName' => 'user', //可选参数, 系统根据字段结构注释自动读取表名
           'alias' => 'u', //必填参数 表别名
           'no' => 'sql_pre.user_id = u.id' // 可选参数,系统根据字段结构注释自动读取关联
         )   
     ];
    

    对应的Sql资源

     LEFT JOIN user u on sql_pre.user_id = u.id
    

    一般情况下, 系统会分析字段,自动完成关联表与实体的绑定关系。

    非正常自由度比较高的写法,可能会导致系统无法完成分析工作, 出现问题,可以通过ResultSetMappingBuilder参数手动绑定(不是必须)。

  9. RA_ORDER_BY(排序)

    生效条件

    如果规则值真不为空,则生效。

    写法

     $rules = [
        'create_at' . Rule::RA_ORDER_BY => "ASC"
     ];
    

    对应的Sql资源

     sql_pre.create_at ASC
    
  10. RA_SQL(sql重写)

    生效条件

    如果规则值真不为空,则生效。

    写法

    $rules = [
       'id' . Rule::RA_SQL => "(1 + 1)"
    ];
    

    对应的Sql资源

    SELECT (1 + 1) as id from table_name
    

    当我们需要字段不变,但查询的内容需要编化的时候,就可以使用此规则对查询该字段的字段Sql进行重写。

找到错别字了?本文档有什么问题么?分叉并编辑 它 !

CJayhe

谢谢您的赞赏~

使用微信扫描二维码完成支付

抱歉弹框打扰,系统检测到您今日累计浏览时长已达120秒。如果我们的项目对您有帮助,在 关闭窗口之前,希望能够阅读弹框内容,帮助我们变得更好。

一个成功的项目,实现功能只是基础,合理的架构,对资源的调度能力才是灵魂。 PHPZlc, 致力于在Symfony的基础上提供“知行合一”的项目开发方案。

如果您有关切问题和好的想法:

提交

如果您想帮助我们,可以为我们点亮星星,也可以提供资金支持。

您还可以通过以下渠道,关注我们,获取最新的框架动态,帮助项目获取人气,扩大影响力。

开源伙伴招募:https://phpzlc.com/blog/11.html

由于我们无法获取您是否已经是我们的会员了,所以此弹框每日都会弹出一次,关闭