ThinkPHP6.0 모델



ThinkPHP6 모델

  • 데이터베이스 구성 파일에서 데이터베이스 연결 정보를 구성했는지 확인하세요

  • 모델은 자동으로 데이터 테이블에 해당합니다. 테이블 접두사를 뺀 데이터 테이블 이름, 낙타 표기법 사용, 첫 번째 문자는 대문자로 표시됩니다.

  • 모델에 자동으로 해당하는 데이터 테이블 이름은 소문자 + 밑줄 사양을 따릅니다. 모델의 테이블 속성을 설정해야 합니다.

1. 모델 만들기

모델 이름데이터베이스 접두사
Catshop_cat
상품 shop_goods
사용자 주문 shop_user_order

테이블 접두사 설정: config/database.php 파일의 prefixconfig/database.php 文件里 prefix

  • 第一步:创建一个跟控制器平级的目录,目录名:model

  • 第二步:在 model 创建 Goods.php 文件

二、模型操作

在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版

  • 模型文件里的自定义方法,不要和 thinkphp 方法一样名称

  • 模型里的 Goods:: 也可以用 static:: 关键词

  • 链式操作,都可以在模型里使用

1、find查询数据

find 获取单条数据,返回的是当前模型的对象实例

namespace appmodel;

use thinkModel;

class Goods extends Model{

    public function find(){

        $find = Goods::find(6);

        $find = Goods::where('id',7)->find();

        return $find;

    }

}

2、controller怎么调用model

namespace appcontroller;

use appmodelGoods;

class Index{

    public function index(){

        $db = new Goods();

        $index = $db->find();

        print_r($index);

    }

}

find(6) 查询失败,是因为数据库主键名称不是 id

3、select查询数据

select 获取多条数据,返回的是当前模型的对象实例

public function select(){

    $select = Goods::select();

    $select = Goods::select(6);

    $select = Goods::where('id','>',7)->select();

    return $select;

}

4、数据转换

toArray方法将当前的模型实例输出为数组

public function select(){

    $select = Goods::select();

    $select = Goods::select(6);

    $select = Goods::where('id','>',7)->select();

    return $select->toArray();

}

5、增加数据

  • create

    • 1단계 : 컨트롤러와 동일한 수준에 디렉터리를 생성합니다. 디렉터리 이름: model
  • 2단계: model Goods.php file

    2. 모델 연산

    모델에서 데이터베이스 클래스의 메서드를 호출하는 것 외에 (즉, 데이터베이스의 모든 쿼리 생성자 메서드를 모델에서 지원할 수 있음) , 자신만의 메소드를 정의할 수 있으므로 모델을 데이터베이스의 향상된 버전으로 생각할 수도 있습니다

    • 모델 파일의 사용자 정의 메소드 thinkphp 메소드 Name🎜🎜
    • 🎜 Goods::와 동일해서는 안 됩니다. 모델의 static:: 키워드🎜🎜
    • 🎜도 사용할 수 있습니다. 모델에서 체인 연산을 사용할 수 있습니다. 🎜🎜🎜🎜1, find를 사용하여 데이터를 쿼리하고 🎜🎜find를 사용하여 단일 데이터 조각을 얻으면 반환되는 것은 현재 모델의 객체 인스턴스입니다 🎜🎜. 🎜namespace appmodel;🎜🎜use thinkModel;🎜🎜class Goods 확장 모델{ 🎜🎜 public function find(){🎜🎜 $find = Goods::find(6);🎜🎜 $find = Goods::where('id' ,7)->find();🎜🎜 return $find; 🎜🎜 }🎜🎜}🎜
    🎜2. controller에서 model을 호출하는 방법 🎜🎜🎜namespace appcontroller;🎜🎜use appmodelGoods;🎜🎜class Index{🎜🎜 public function index(){🎜🎜                                                                                사용   사용 사용 '               사용 ' 통해 ' 통해 ' s ' 통해 사용 ‐ ‐ ‐‐ ‐ 데이터베이스 기본 키 이름이 id🎜🎜3이 아니기 때문에 find(6) 쿼리가 실패했습니다. select Query data🎜🎜select는 여러 데이터 조각을 가져오고 현재 모델의 객체 인스턴스를 반환합니다🎜🎜 🎜공개 기능 select (){🎜🎜 $select = 상품::select();🎜🎜 $select = 상품::select(6);🎜🎜 $select = 상품::where('id','>' ,7)- >select();🎜🎜 Return $select;🎜🎜}🎜🎜4. 데이터 변환🎜🎜toArray 메소드는 현재 모델 인스턴스를 배열로 출력합니다🎜🎜 🎜공개 기능 select (){🎜🎜 $select = 상품::select();🎜🎜 $select = 상품::select(6);🎜🎜 $select = 상품::where('id','>' ,7)- >select();🎜🎜 return $select->toArray();🎜🎜}🎜🎜5. 데이터 추가🎜
    • 🎜create 정적 메소드는 데이터를 추가하고 현재 모델의 객체 인스턴스를 반환합니다🎜🎜🎜🎜🎜public function create(){🎜🎜 $create = Goods::create([🎜🎜 "고양이" = > 3,🎜'제목' = & gt; '신상품',

      '가격' = & gt; '59 .99 ',

      ' add_time '= & gt; 시간()

      ]); 자체 증가 ID

      Return $create;

      }

      데이터 추가에 대한 모범 사례 원칙: 데이터를 추가하려면 create 메서드를 사용하고 일괄적으로 데이터를 추가하려면 saveAll을 사용합니다.

      6. 데이터 수정

      update 정적 메서드는 데이터를 수정하고 현재 모델의 객체 인스턴스를 반환합니다
      • 저장 데이터를 업데이트하려면 필드를 변경하세요. 이 방법은 updateupdate 静态方法修改数据,返回的是当前模型的对象实例

      • save 在取出数据后,更改字段更新数据。这种方式是最佳的更新方式

      namespace appmodel;

      use thinkModel;

      class Goods extends Model{

          public function update(){

              # 更新方式1

              $update = Goods::update(

                  ['price'=>'99.99'],

                  ['id'=>22]

              );

              return $update;

              # 更新方式2

              $user = Goods::find(23);

              $user->price     = '102.99';

              $save = $user->save();

              return $save;

          }

      }

      7、删除数据

      • delete 静态方法删除数据,返回的是当前模型的对象实例

      • destroy 根据主键删除

      public function delete(){

          # 删除方法1

          $delete = Goods::where('id',3)->delete();

          # 删除方法2

          $delete = User::destroy(4);

          return $delete;

      }

      TP模型如果只能增删查改,不如在 Controller

    namespace appmodel;

    use thinkModel;

    class Goods extends Model{🎜🎜 public function update(){🎜🎜 #Update method 2를 업데이트하는 가장 좋은 방법입니다. return $update;🎜🎜          # 업데이트 방법 2🎜🎜           $user = Goods::find(23);🎜🎜                                               '를 사용하여 사용            out out out through out ' ' s ' ~ ' s ' through ‐ ‐ ‐‐‐ 사용​ ​ ​ ​                               ~를 통해 ‐ ‐ ‐ ‐‐ ‐‐‐‐ ‐ ‐ 🎜🎜 }🎜🎜}🎜🎜🎜7. 데이터 삭제🎜🎜🎜🎜delete정적 메서드는 데이터를 삭제하고 반환합니다. 현재 모델의 객체 인스턴스🎜
  • 🎜🎜destroy 기본 키에 따라 삭제🎜
🎜public function delete(){🎜🎜 # 삭제 방법 1🎜🎜 $delete = 물품::where('id',3)->delete( );🎜🎜 #삭제 방법 2🎜🎜 $delete = User::destroy(4);🎜🎜 return $delete ;🎜🎜}🎜🎜🎜TP 모델의 추가, 삭제, 확인, 수정만 가능하다면 Controller를 실행하여 사용하는 것이 좋습니다. TP 모델에는 많은 기능이 있는데 아래에서 하나씩 소개하겠습니다🎜🎜3. 모델 설정🎜🎜 데이터베이스에 더 잘 적응하기 위해 모델은 해당 데이터베이스 속성을 미리 설정하고 하나의 파일에 하나의 데이터 테이블을 구성할 수 있습니다. 🎜
AttributeDescription
name 모델 이름(데이터 테이블 접미사와 접미사가 없는 테이블 이름과 동일, 기본값은 현재 모델 클래스 이름)
table 데이터 테이블 이름 (기본 자동 Get)
pk 기본 키 이름(기본값은 id)
schema 모델에 해당하는 데이터 테이블 필드 및 유형
type 모델에 필요한 필드 및 유형 자동으로 변환됨
사용하지 않음 데이터 테이블 버려진 필드(배열)

1. 이름 및 테이블

데이터 테이블에 접두사가 없으면 이름 및 테이블 속성 정의에 차이가 없습니다.

class Goods 확장 모델{

protected $name = 'Goods ';

protected $table = 'shop_goods';

공개 함수 select(){

$select = Goods::select();

return $select->toArray();

}

}

2.pk 기본 키 이름을 변경하세요

model. 기본 기본 키는 id

// 기본 키를 shop_id로 변경할 수 있습니다. Try

ALTER TABLE `ouyangke`.`shop_goods`

CHANGE COLUMN `id` `shop_id ` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' Product ID' FIRST,

DROP PRIMARY KEY,

ADD PRIMARY KEY(`shop_id`) USING BTREE;

class 상품 확장 모델{

​ protected $name = '상품';

protected $table = 'shop_goods';

protected $pk = 'shop_id';

public function find($id=1){

$find = Goods::find ($id);

return $find->toArray();

}

}

3. schema 모델에 해당하는 데이터 테이블 필드 및 유형을 설정합니다

  • 자동으로 가져옵니다. 기본값(필드 유형 포함)이지만 자동 획득으로 인해 쿼리

  • 스키마 속성이 정의되면 전체 데이터 테이블 필드 유형을 정의해야 합니다

  • 유형은 PHP 데이터 유형에 따라 정의됩니다. json 유형이므로 json

class Goods extends Model {

protected $name = 'Goods';

protected $table = 'shop_goods';

protected $pk = '로 직접 정의할 수 있습니다. shop_id';

protected $schema = [

'shop_id' => 'int',

                                                                    사용 ' ‐ ‐ ‐ ‐ ‐ ‐ 'cat' => 'int',

                                                    out out off out out   ‐ ‐‐ ‐ to 'stock' => 'int',

'status' => 'int',

'add_time' => 'int'

];

자동으로 변환되어야 하는 필드 유형의 경우 유형 속성을 사용할 수 있습니다

protected $type = [

] 'shop_id' => 'int'

];

public function select(){

$select = 상품::select();

+

protected $pk = 'shop_id';

protected $disuse = [

'할인',

'재고'disuse

] ;

공개 기능 select(){

$select = 상품::select();

                                                     ~                          ‐‑ 의 ‐ ‐ ‐ ‐ing return $select->toArray();

필드 목록 (배열)은 필드가 쓰기를 허용하는 필드 목록 (배열)이 필드가 대체 민감도 (기본값이 사실이든)

六、模型事件

  • 模型事件是指는 进行模型的查询및写入操事的时候触发的操事行为

  • 模型事件只에서 调用模型的方法生效,使用查询构造器操作是无效的

    ㅋㅋㅋ 2
before_insert
PropertyDescription
suffix 데이터 테이블 접미사(기본값은 비어 있음)
connection 데이터베이스 연결(기본값은 데이터베이스 구성 읽기)
query 모델이 사용하는 쿼리 클래스 이름
필드
json 필드를 JSON 데이터로 설정
jsonType JSON 필드 유형 설정
jsonAssoc JSON 데이터 반환 배열 설정
autoWriteTimestamp 생성 및 업데이트된 타임스탬프를 자동으로 작성 필드(기본값은 꺼짐)
createTime 타임스탬프 필드 생성
updateTime 업데이트 타임스탬프 필드
deleteTime 은 일시 삭제 마커 필드를 정의하는 데 사용됩니다.
def aultSoftDelete 정의 일시 삭제된 필드의 기본값

4. 모델의 주요 기능

1. Getter

  • getter의 기능은 모델 인스턴스의 (원본) 데이터를 자동으로 처리하는 것입니다.

  • 네이밍 규칙: get + 필드 이름 + Attr< /code>get + 字段名 + Attr

  • 字段名是数据表字段的驼峰转换

class Goods extends Model{

    public function index(){

        $find = Goods::find(10);

        echo $find->status;

        return $find->toArray();

    }

    public function getStatusAttr($v){

        $status = [

            1=>'开启',

            2=>'关闭'

        ];

        return $status[$v];

    }

}

2、修改器

  • 修改器的主要作用是对模型设置的数据对象值进行处理

  • 命名规则: set + 字段名 + Attr

class Goods extends Model{

    public function index(){

        $create = Goods::create([

            'cat' =>  3.33,

            'title' =>  '新商品',

            'price' =>  '59.99',

            'add_time' => time()

        ]);

        return $create;

    }

    public function setCatAttr($v,$all){

        // $all 全部参数

        return (int)$v;

    }

}

3、搜索器

  • 搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式

  • 命名规则: search + 字段名 + Attr

필드 이름은 데이터 테이블 필드의 카멜 표기법 변환입니다

class Goods extends Model{

public function index(){

                                                                                          $find->status;

ㅋㅋㅋ ,,,,,,,,, 켜기',

2=>'닫기'

                                                                    ~                                                값이 처리됩니다

. 규칙: set + 필드 이름 + Attr

class Goods 확장 모델{

public function index(){

🎜 $create = Goods::create ([🎜🎜                                        > > > time()🎜🎜 ]);🎜🎜               $create 반환 > 🎜🎜🎜검색기의 기능은 필드(또는 검색 식별자)의 쿼리 조건 표현을 캡슐화하는 것입니다. 🎜🎜🎜🎜명명 규칙: 검색 + 필드 이름 + 속성🎜🎜 🎜🎜🎜class 상품 확장 모델{🎜🎜 공용 함수 index(){🎜🎜 $select = 상품::withSearch([' title'],[🎜🎜 ]) -> ;select();🎜🎜                                                                                ,,,                        ,,,,,,,,,,, $v }🎜🎜}🎜🎜🎜4 .데이터 확인🎜
  • 데이터 세트가 비어 있는지 판단하려면 empty 를 직접 사용하여 판단할 수 없습니다. empty 判断

  • 必须使用数据集对象的 isEmpty

데이터 세트의 isEmpty 메소드를 사용해야 합니다. 판단 대상

class Goods 확장 모델{

public function index(){

$select = Goods::where('title','1')->select();

if( 비어 있음($select)){

에코 111;

                                                                         

5. 오른쪽 목록이 모델 예시

model code

namespace appmodel;

use thinkModel;

use thinkfacadeDb;

class Goods 확장 모델{

protected $name = 'Goods';

protected $table = 'shop_goods';

public function get_all($ where,$order='add_time DESC',$p=1,$ 총=10){

$count = 상품::where($where)->count();

$list = 상품::where($where)

                                             ~ > )){

                                                                                                                                  return null; 'cat'] = Db::table(' shop_cat')-> where('id',$data_v['cat'])->value('name'); /$total),

                                                             $status = [

1=> ;'켜짐',

        2=> ;'끄기'

                                                                                                            귀국 날짜('Y-m-d',$v);

}

}

컨트롤러 코드

공용 함수 인덱스(){

    $title = '商城';

    $login = '欧阳克';

    # 左侧菜单

    $menu = Db::table('shop_menu')-> where('fid',0)->select();

    $left = [];

    foreach($menu as $menu_k=>$menu_v){

        $left[$menu_k] = $menu_v ;

        $left[$menu_k]['lists'] = Db::table('shop_menu')->where('fid',$menu_v['id'])->select();

}

    # 右侧列表

    $param = Request::param();

    if(isset($param['status']) && $param['status'] == 1){

        $where ['상태'] = 1;

    }else if(isset($param['status']) && $param['status'] == 2){

        $where['status'] = 2;

    }else{

        $where = true;

    }

    $p = isset($param['p']) ? $param['p'] : 1;


    $db = 새 상품();

    $order = [

        'add_time DESC',

        'id DESC'

    ];

    $오른쪽 = $db->get_all($where,$order,$p,5);

    보기::할당([

        'title'  => $title,

        'login' => $login,

        '왼쪽' => $left,

        '오른쪽' => $right['data'],

        'count' => $right['count'],

        'p' => ; $p,

        'status' => isset($param['status']) ? $param['status'] : 0

    ]);

    return View::fetch();

}

html代码

{$right_v.status}{$right_v.add_time}
전에 추가 AfterInsertBeforeUpdate업데이트 후쓰기 전쓰기 후8 before_restore beforerestoreonBeforeRestore11 after_restore AfterRestoreonAfterRestore
namespace app\model;
use think\Model;
class Goods extends Model{
    public function one_update(){
        $update = Goods::update(
            ['price'=>'99.99'],
            ['id'=>22]
        );
        return $update;
    }
    # 执行更新操作,就会之下onBeforeUpdate方法
    public static function onBeforeUpdate($goods){
        print_r($goods->price);
        return true;
    }
}
onBeforeInsert 3 after_insert
onAfterInsert4before_update
onBeforeUpdate5 after_update
onAfterUpdate6 before_write
onBeforeWrite7 after_write
onAfterWrite