>백엔드 개발 >PHP 튜토리얼 >ThinkPHP 모델 상세 설명_php 기술

ThinkPHP 모델 상세 설명_php 기술

WBOY
WBOY원래의
2016-05-16 20:10:15964검색

모델 정의. 기본적으로 ThinkPHP의 모델 클래스는 /Home/Model/ 디렉터리에 있습니다. 모델 클래스는 일반적으로 시스템의 ThinkModel 클래스 또는 해당 하위 클래스를 상속해야 합니다.

파일 이름은 컨트롤러 이름과 동일하게 UserModel.class.php 방식을 따릅니다

<&#63;php
namespace Home\Model;

use Think\Model;

class UserModel extends Model {
}

모델 클래스의 역할은 대부분의 경우 데이터 테이블을 운영하는 것입니다. 시스템 사양에 따라 모델 클래스 이름을 지정하면 대부분의 경우 데이터 테이블에 자동으로 대응할 수 있지만 사용자가 직접 데이터를 맞춤 설정할 수도 있습니다. 귀하의 필요에 따라 테이블 설정 및 작동.

먼저 구성 파일에서 데이터베이스 연결 정보를 설정해야 합니다.

  'DB_TYPE'        => 'mysql',   
  'DB_HOST'        => 'localhost', 
  'DB_NAME'        => 'database',  
  'DB_USER'        => 'username',   
  'DB_PWD'        => 'password',  
  'DB_PORT'        => '3306',   

이러한 구성 정보는 여전히 /Home/Conf/config.php 파일에 설정되어 있습니다.

데이터 테이블 접두사 지정

아래 첨자 접두사를 지정하세요. 첫 번째 강의에서 지정한 구성 항목이 지정되어 있으므로 데이터 테이블을 유연하게 구성할 수 있습니다.

protected $tablePrefix = 'top_';

데이터베이스 테이블에 테이블 접두사가 없으면 대신 빈 문자열을 사용하세요.

protected $tablePrefix = '';

여기에서 지정된 데이터 테이블은 테이블 접두사를 추가할 필요가 없습니다.

protected $tableName = 'user';

예를 들어 데이터베이스에 테이블 접두사가 없는 users라는 데이터 테이블이 있는 경우 다음 두 가지 방법을 사용하여 모델에서 다음을 정의할 수 있습니다.

먼저 시스템 사양에 따라 모델 이름을 직접 지정합니다. 예를 들어 UsersModel이라는 이름을 지정하는 경우 이 클래스에 다음 설정만 추가하면 됩니다.

protected $tablePrefix = '';

ThinkPHP 시스템은 자동으로 사용자 테이블을 찾습니다.

두 번째 경우, 모델 클래스의 이름이 시스템 사양에 따라 지정되지 않은 경우(예: 실수로 UserModel로 명명된 경우) 이 경우 다음과 같이 테이블 접두사와 표시를 동시에 지정할 수 있습니다.

protected $tablePrefix = '';

protected $tableName = 'users';

또는 trueTableName을 직접 지정합니다:

보호된 $trueTableName = '사용자';

모델은 일반적으로 데이터 테이블을 조작하는 데 사용되므로 모델의 기본 CURD를 살펴보겠습니다.

참고: 데모를 용이하게 하기 위해 데모용 UserController에 testDemo() 메서드를 정의합니다

public function testDemo()
  {

  }

다음 코드는 이 방법에서 하나씩 시연됩니다. http://localhost:8999/index.php/Home/User/testDemo를 방문하면 실제 효과를 확인할 수 있습니다.

기록 추가

$user = M('User');
$data['username'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$user->create($data);
$record = $user->add();
dump($record);

add()는 삽입된 데이터의 ID를 반환합니다. 존재하지 않는 테이블 필드의 경우 add() 메서드가 자동으로 필터링합니다.

기록 읽기

ThinkPHP에서 데이터를 읽는 방법은 여러 가지가 있으며 일반적으로 데이터 읽기, 데이터 세트 읽기, 필드 값 읽기로 구분됩니다

$user = M('User');

$record = $user->where('username="ThinkPHP"')->find();

dump($record);

필드 값 읽기

$user = M('User');

$record = $user->where('id=3')->getField('username');

dump($record);



기본적으로 필드가 하나만 있는 경우 조건에 맞는 데이터 테이블의 필드 첫 번째 행 값이 반환됩니다. getField()가 여러 필드를 전달하는 경우 반환 값은 연관 배열이 됩니다. :

$user = M('User');

$record = $user->getField('username,email');
dump($record);<br />

이 배열은 항상 키 값으로 전달된 첫 번째 필드를 사용합니다. 다음과 같이 수정된 경우:

$user = M('User');

$record = $user->getField('email,username');

dump($record);

위의 두 코드를 각각 testDemo()에 넣으면 다른 결과 집합이 표시됩니다.

save() 메소드를 사용하여 데이터 업데이트

$user = M('User');

$data['username'] = 'ThinkPHPSave';
$data['email'] = 'ThinkPHPSave@outlook.com';

$record = $user->where('id=3')->save($data);

dump($record);

여기서 $record는 성공적인 변경을 나타내는 1을 반환합니다.

물론 다음과 같이 할 수도 있습니다.

$user = M('User');

$user->username = 'ThinkPHP';
$user->email = 'ThinkPHP@outlook.com';

$record = $user->where('id=3')->save();

dump($record);

일상적인 개발 중에 특정 필드만 업데이트되는 상황이 자주 발생합니다. 이는 다음과 같은 방법으로 달성할 수 있습니다.

$user = M("User"); 
$record = $user->where('id=4')->setField('username','ThinkPHPChangeName');

dump($record);

여러 필드를 동시에 업데이트하면 데이터를 배열 형식으로 setField() 메서드에 전달할 수 있습니다.

$user = M('User');
$data = array('username'=>'ThinkPHPChangeArray','email'=>'ThinkPHP@array.com');
$record = $user-> where('id=6')->setField($data);
dump($record);

ThinkPHP는 삭제 메소드를 사용하여 데이터를 삭제합니다. 예:

$user = M('User');
$record = $user->where('id=3')->delete();
dump($record);

또는 직접 사용할 수도 있습니다:

$record = $user->delete('1,2,5');
dump($record);

이렇게 하면 기본 키 1, 2, 5의 3개 레코드가 삭제되었습니다.

활성 레코드

ThinkPHP는 ActiveRecords 모드의 ORM 모델을 구현하고 비표준 ORM 모델을 채택합니다. 테이블은 클래스에 매핑되고 레코드는 개체에 매핑됩니다. 다음 예에서는 ActiveRecords를 사용하여 데이터 테이블에서 CURD를 재현하여 ActiveRecords가 우리에게 제공하는 이점을 확인합니다.

$user = M("User");

$user->username = 'ThinkPHPWithActive';
$user->email = 'ThinkPHPActive@gmail.com';

$record = $user->add();

dump($record);

기록 읽기

아마 AR의 가장 큰 특징은 쿼리 모드일 것입니다. 대부분의 경우 쿼리 조건이 기본 키 또는 특정 키 필드를 기반으로 하기 때문에 모드가 간단하고 사용하기 쉽습니다. ThinkPHP는 이러한 유형의 쿼리를 훌륭하게 지원합니다.

예를 들어 기본 키 2를 사용하여 사용자 정보를 가져옵니다.

$user = M("User");

$record = $user->find(2);

dump($record);

어디()인지 물을 필요 없이 간단하고 친숙합니다. 또 다른 예:

$user = M("User");

$record = $user->getByUsername("jelly");

dump($record);

여러 레코드를 조회하려면 다음 방법을 사용하세요.

$user = M("User");

$record = $user->select('1,3,8');

dump($record);

기록 업데이트

$user = M("User");
$user->find(21);
$user->username = 'TOPThinkChangeWithAR';
$record = $user->save();

dump($record);

删除记录

删除单条纪录

$user = M("User");

$record = $user->delete(8);

dump($record);

删除多条纪录

$user = M("User");

$record = $user->delete('15,16');

dump($record);

// todo: 这里的自动验证和关联模型 调试不出来。

自动完成

自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,当使用create()方法创建数据对象的时候会触发自动完成数机制。

因此,在ThinkPHP鼓励使用create()方法来创建数据对象,因为这是一种更加安全的方式,直接通过add()或者save()方法实现数据写入无法出发自动完成机制。

自动完成通常用来完成默认字段写入(比如添加时间戳),安全字段过滤(比如加密密码)以及业务逻辑的自动处理等。可以通过模型类里面通过$_auto属性定义处理规则。下面演示如何自动完成添加时间戳:

在UserModel中,声明自动完成的定义数组$_auto :

protected $_auto = array (
    array('created_at','date("Y-m-d H:i:s", time())',3,'function'),
    array('updated_at','date("Y-m-d H:i:s", time())',3,'function'),
  );

还有一种是理由auto()方法动态设置自动完成的机制,可以到官方文档去看看

设置完成之后,我们在testDemo()方法中创建一条用户数据:

$user = D('User');
$data['username'] = "ThinkPHP";
$data['email'] = "ThinkPHP@gmail.com";
$user->create($data);
$record = $user->add();
dump($record);

测试,如果返回纪录的id值,说明用户纪录创建成功。要验证数据是否自动完成,你可以直接使用:

$user = D('User');
$record = $user->find(id);
dump($record);

自动验证

自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create()创建数据对象的时候自动进行数据验证。

数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。

通常用于表单验证

数据验证有两种方式:

静态方式:在模型类里面通过$_validate属性定义验证规则。

动态方式:使用模型类的validate()方法动态创建自动验证规则。

无论是什么方式,验证规则的定义是统一的规则,定义格式为:

array(
     array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
     array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
     ......
);
下面以$_validate静态方式举例如何使用自动验证:

在UserController中创建register()方法,对,几乎每一个Web应用都需要实现用户注册这一步。

public function register()
  {
    $this->display();
  }

对,就是这么简单,这个方法只是将相应的视图文件渲染出来。所以接下来我们创建对应的视图文件,也就是:./Application/Home/View/User/register.html

<extend name="Index/base" />
<block name="main" >
<form method="post" action="__URL__/registerValidate">
  <div class="form-group">
    <label for="exampleInputName">Name</label>
    <input type="text" name="username" class="form-control" id="exampleInputName" placeholder="Name">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail">Email</label>
    <input type="email" name="email" class="form-control" id="exampleInputEmail" placeholder="Email">
  </div>

  <button type="submit" class="btn btn-default">Submit</button>
</form>
</block>

上面就是一些HTML代码和一点模板的知识,对于模板,我们后续会讲到,但不管怎样,现在我们访问
http://localhost:8999/Home/User/register,就可以看到我们的注册表单页面了。

注意到form表单中,action="__URL__/registerValidate",这表示提交到当前的控制器的registerValidate()方法处理,所以我们在UserController中增加registerValidate()方法:

public function registerValidate()
  {
    $data['username'] = $_POST['username'];
    $data['email'] = $_POST['email'];

    $user = D("User");

    if ( !$user->create($data) ) {
      exit($user->getError());
    }
    //todo: validation passes, add data to database and redirect somewhere

    echo 'validation passes';

  }

这里的if ( !$user->create($data) )会触发自动验证并判断验证是否通过验证。你可以尝试在表单里填写不同的数据来进行测试,也可以修改一下验证规则,更多规则可以到官网查看:

http://document.thinkphp.cn/manual_3_2.html#auto_validate

关联模型

通常我们所说的关联关系包括下面三种:

一对一关联 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO
一对多关联 :ONE_TO_MANY,包括HAS_MANY 和 BELONGS_TO
多对多关联 :MANY_TO_MANY

关联定义

ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:
HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY。
一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。要支持关联操作,模型类必须继承Think\Model\RelationModel类,关联定义的格式类似于:

namespace Home\Model;
use Think\Model\RelationModel;
class UserModel extends RelationModel{
   protected $_link = array(
    '关联' => array(
      '关联属性1' => '定义',
      '关联属性N' => '定义',
    ),
   );
}

关于关联属性的定义和值,你可以到官方文档仔细查看,我们下面也会给出一些最常用的。

在我们的讲解例子中,会采用HAS_MANY和BELONGS_TO来演示,对于其他的几个关系模型,可以参考官方文档举一反三。

首先我们知道数据库里面有两张表,用户表和文章表,并且我们也为其创建了不同的模型(UserModel ArticelModel)。

现在我们仔细来想想他们之间的对应关系:一个用户可以拥有多篇文章,而每一篇文章都属于某个特定的用户。所以我们可以分别为这两种关系添加关联模型:

在UserModel中:

protected $_link = array(
    'Article' => self::HAS_MANY
  );

在ArticleModel中:

protected $_link = array(
    'User' => self::BELONGS_TO
  );

以上者两种都是最简洁的模型关联声明。因为在最开始设计数据库的时候,我们遵守了ThinkPHP的官方的规范:

外键的默认规则是当前数据对象名称_id,例如:UserModel对应的可能是表think_user,那么think_user表的外键默认为user_id,如果你的外键不是user_id,而是其他自定义的字段如:user_identify,那么就必须在定义关联的时候定义 foreign_key 。如下:

在UserModel中:

protected $_link = array(
    'mapping_type' => self::HAS_MANY,
    'class_name'  => 'Article',
    'foreign_key'  => 'user_identify',
  );

更多自定义的关联模型参数可以到官网查看。

有了以上的定义之后,我们就可以在检索用户数据的同时将属于他的文章也一起检索出来,使用relation()。

同样是在testDemo()这个方法中:

$user = D('User');
$record = $user->relation(true)->find(4);
dump($record);

访问熟悉的http://localhost:8999/Home/User/testDemo,你将会看到神奇的结果。

以上所述就是本文的全部内容了,希望大家能够喜欢。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.