think\Model::scope PHP Method

scope() public static method

命名范围
public static scope ( string | array | Closure $name ) : Model
$name string | array | Closure 命名范围名称 逗号分隔
return Model
    public static function scope($name)
    {
        if ($name instanceof Query) {
            return $name;
        }
        $model = new static();
        $params = func_get_args();
        $params[0] = $model->db();
        if ($name instanceof \Closure) {
            call_user_func_array($name, $params);
        } elseif (is_string($name)) {
            $name = explode(',', $name);
        }
        if (is_array($name)) {
            foreach ($name as $scope) {
                $method = 'scope' . trim($scope);
                if (method_exists($model, $method)) {
                    call_user_func_array([$model, $method], $params);
                }
            }
        }
        return $model;
    }

Usage Example

Example #1
0
 public function testQuery()
 {
     $user_model = new Model('user', $this->getConfig());
     $sql = "select id,create_time from tp_user where username='******' limit 1";
     $result = $user_model->query($sql);
     $id = $result[0]['id'];
     $time = $result[0]['create_time'];
     $bind = ['create_time' => $time, 'status' => 1];
     $info = $user_model->where(['create_time' => ':create_time'])->where(['status' => ':status'])->bind($bind)->field(true)->find(['cache' => ['key' => true]]);
     $data = ['id' => $id, 'username' => 'test', 'password' => md5('123456'), 'status' => '1', 'create_time' => $time];
     $this->assertEquals($data, $info);
     $_GET['id'] = $id;
     $result = $user_model->where(['id' => ':id'])->bind('id', $_GET['id'])->field('password,create_time', true)->order('id')->limit('0,10')->select(['cache' => ['key' => true, 'expire' => 0], 'index' => 'username']);
     $data = ['id' => $id, 'username' => 'test', 'status' => '1'];
     $this->assertEquals($data, $result['test']);
     $_GET['status'] = '1';
     $result = $user_model->where(['status' => ':status'])->bind('status', $_GET['status'], \PDO::PARAM_INT)->field('password,create_time', true)->order('id', 'desc')->index('id,username')->page('0,10')->select();
     $data = ['1' => 'test', '2' => 'test2'];
     $this->assertEquals($data, $result);
     $time = $user_model->where(['status' => 1])->cache('user_create_time')->getField('create_time');
     $ids = $user_model->where(['status' => 1])->cache('user_id')->getField('id', true);
     $this->assertEquals(2, count($ids));
     $result = $user_model->cache(true)->getField('username,status,create_time', '|');
     $data = ['test' => '1|' . $time, 'test2' => '1|' . $time];
     $this->assertEquals($data, $result);
     $result = $user_model->cache(10)->getField('username,status');
     $data = ['test' => '1', 'test2' => '1'];
     $this->assertEquals($data, $result);
     $result = $user_model->scope(['field' => 'username', 'where' => 'status=1'])->select();
     $data = [['username' => 'test'], ['username' => 'test2']];
     $this->assertEquals($data, $result);
     $result = $user_model->master()->lock(true)->distinct(true)->force('create_time')->comment('查询用户名')->field('username')->fetchSql(true)->select();
     $sql = 'SELECT DISTINCT  `username` FROM `tp_user` FORCE INDEX ( create_time )   FOR UPDATE  /* 查询用户名 */';
     $this->assertEquals($sql, $result);
     $order_model = new Model('order', $this->getConfig());
     $result = $order_model->field('user_id,sum(amount) amount')->group('user_id')->having('sum(amount) > 1000')->select();
     $this->assertEmpty($result);
     $result = $order_model->getLastSql();
     $sql = 'SELECT `user_id`,sum(amount) amount FROM `tp_order` GROUP BY user_id HAVING sum(amount) > 1000 ';
     $this->assertEquals($sql, $result);
 }