Thinkphp5 usa el modelo modelo para operar la base de datos

Diseño de tabla de datos estándar de Thinkphp:

Campo de hora de creación: create_time

Campo de hora de actualización: update_time

Eliminar campo de hora: delete_time 

Escriba select int, como se muestra a continuación:

Uno, crea la carpeta del modelo

Cree una nueva carpeta denominada modelo en el directorio de objetos secundarios en la carpeta de la aplicación, que está al mismo nivel que el controlador correspondiente y los directorios de vista, como se muestra en la siguiente figura:

Si hay varios módulos (como índice de front-end, administrador de back-end) y las bases de datos operativas son similares, entonces el modelo modelo se puede colocar en el módulo público común, de la siguiente manera:

Dos, crea una clase de modelo modelo

1. Cree un archivo de objeto de modelo en el directorio de modelos. Generalmente, el nombre del modelo corresponde al nombre de la tabla, por ejemplo:

表名 pre_user       --------------->  模型名 User.php
表名 pre_user_info  --------------->  模型名 UserInfo.php

 2. Definir el modelo modelo

<?php
namespace app\index\model;
use think\Model;
use think\Db;

class User extends Model{
	/**
     * 定义变量
     * 1.变量名称应与数据表中的字段名相同
     * 2.此处可根据需求省略,因为如果没有,thinkphp会自动在数据表中寻找的对应字段名
     */
	public $username;
	public $password;
}
?>

3. Si el nombre de la definición del modelo de datos no coincide con el nombre de la tabla, se requieren definiciones y declaraciones adicionales, como se indica a continuación:

<?php
namespace app\index\model;
use think\Model;
use think\Db;

class User extends Model
{
	protected $table = "admin_user";//指定数据表名
    protected $pk = 'id';           //指定主键的字段
}
?>

Tres, el método de llamar al modelo modelo

//导入定义的数据模型类
use \app\index\model\User;

//方法一:
$res = User::get(1);

//方法二:
$user = new User;
$res = $user::get(1);	

//方法三:
use think\Loader;
$user = Loader::model("User");
$res = $user::get(1);

//方法四:
$user = model("User");       
$res = $user::get(1);

Cuatro, operación de consulta

obtener Obtener un registro

$res = User::get(1);

todos obtienen múltiples registros

1. Sin transferencia de parámetros

$result = User::all(); //查询出所有记录 

2. El parámetro es n, n es un número entero positivo 

$result = User::all(1); //查询出id为1的记录

3. Los parámetros son 'n1, n2, n3 ...'

$result = User::all('7, 8, 9, 10'); //查询出id为7、8、9、10的4条记录 

4. Los parámetros son [n1, n2, n3 ...] 

$result = User::all([7, 8, 9, 10]); //查询出id为7、8、9、10的4条记录

buscar para consultar un artículo

 $res = User::where('id','1')->field('name')->find();

 no igual a

-> donde ('id', 'neq', 1)

seleccionar varias consultas

$res = User::where('id','1')->field('name')->limit(2)->order('id DESC')->select();

valor Consultar uno por campo

$res = User::where('id','1')->value('name');

Convierta el resultado en una matriz

$res = $res->toArray();

Número de consultas

//查询总条数
$res = User::count();
//按条件统计条数
$res = User::where('id','>',3)->count();

Cinco, agregue la operación

1. Utilice el método create () para agregar

$res = User::create([
     'name'      => '安阳',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

2. Agregue datos y devuelva la clave primaria agregada

$uid=UserModel::create([
     'name'      => '安阳',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ])->id;

También puede utilizar el método insertGetId de la clase DB, de la siguiente manera:

$uid = User::insertGetId([
     'name'      => '安阳',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

3. Agregar por método de instanciación

 

 $user = new User;
 $user->name =  '安阳';
 $user->age =  23;
 $user->save();

4. Filtre el campo insertado por instanciación y devuelva el número de filas insertadas

 $user = new User;
 $data = [
     'name' => '安阳',
     'age' => 23,
     'email' => '[email protected]'
 ];
 //只有name和age字段会写入
 $res = $user->allowField(['name', 'age'])->save($data);

5. El modelo usa allowField () para filtrar datos en campos de tablas que no son de datos

//定义模型对象,并传入post数据
$user = new User($_POST);
//过滤post数组中的非数据表字段数据
$user->allowField(true)->save();

6. El modelo usa allowField () para especificar ciertos campos para escribir

$user = new User;
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save($_POST, ['id' => 1]);

7, agregar por lotes usar saveAll ()

user = new User;
$list = [
    ['name'=>'安阳','email'=>'[email protected]'],
    ['name'=>'小柒','email'=>'[email protected]']
 ];
$user->saveAll($list);

También puede utilizar el método insertAll () de la clase DB para devolver el número de elementos agregados correctamente 

$res = User::insertAll([
     'name'      => '安阳',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

Además, otros métodos de filtrado de campos:

1. En la operación de base de datos, puede utilizar estricto para cerrar la inspección estricta de campo

Db::name(‘user’)->strict(false)->insert($data);

2. Utilice el método unset () de php para destruir variables

unset($data[‘file’]);

6. SaveAll agrega varios datos y devuelve la lista de objetos

 $user = new User;
 $data = [
     [
         'name' => '安阳',
         'age' => 20,
         'email' => '[email protected]'
     ],
     [
         'name' => '小柒',
         'age' => 25,
         'email' => '[email protected]'
     ]
 ];
 $res = $user->allowField(['name', 'age'])->saveAll($data);

Seis, operación de actualización

1, la actualización devuelve el número de filas afectadas

 $res = User::where(['id'=>1])->update(['name'=>'安阳']);

2. setField actualiza un campo individualmente

User::where('id',1)->setField('name','安阳');

3, setInc

//setInc('money',10)表示将money字段加上10
User::where(['id'=>1])->setInc('money', 10);

4 、 setDec

//setDec('money',10)表示将money字段减去10
User::where(['id'=>1])->setDec('money', 10);

5. Actualice por lotes, requiera que los datos contengan la clave principal y vuelva a la lista de objetos actualizados

$user = new User;
$res = $user->saveAll([
     ['id'=>1, 'name' => '安阳'],
     ['id'=>2, 'name' => '小柒']
 ]);

Siete, eliminar operación

1. Pase la clave principal y devuelva el número de filas afectadas

$res = User::destroy(1);

2. Pasar las condiciones y devolver el número de filas afectadas

 $res = User::destroy(['name'=>'安阳']);

3. La eliminación condicional devuelve el número de filas afectadas.

 $res = User::where(['id'=>1])->delete();

8. Asuntos

1. Procesamiento de transacciones de control automático

Db::transaction(function(){ 
    Db::table('order')->where(['id'=>1])->delete(); 
	Db::table('user')->where('id'=>1)->setInc('money',10);	
});

2. Controlar manualmente las transacciones

Db::startTrans();//启动事务
try {
    Order::where(['id'=>1])->delete();
	User::where('id'=>1)->setInc('money',10);
	Db::commit();//提交事务
} catch (Exception $e) {
	Db::rollback();	//回滚
}

Nueve, el obtentor del modelo modelo

La convención de nomenclatura del lector es: -> obtener + nombre de joroba del nombre del atributo + Attr

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{		    
    //获取器:将性别的012修改为男、女、未知 返回
	public function getSexAttr($val)
	{
		switch ($val) {
            case 1:
                return '男';
            case 2:
                return '女';
            default:
            return '未知';
		}
	}
   //获取器:格式化时间戳后返回
    public function getUpdateTimeAttr($val){
        if(!empty($val)){
			//如果是时间戳,就格式化
			if(!strtotime($val)) {
				return date('Y-m-d H:i:s',$val);
			}else{
				return $val;
			}
        }else{
			return '';
		}
    }
}

Explicación adicional: strtotime () analiza la descripción de fecha y hora de cualquier texto en inglés como una marca de tiempo de Unix y devuelve una marca de tiempo si tiene éxito; de lo contrario, devuelve FALSE (antes de PHP 5.1.0, esta función devuelve -1 cuando falla)

Diez, el modificador del modelo modelo

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	//修改器
	public function setTimeAttr()
	{
        return time();
	}
    /** 修改器:对密码字段加密之后存储
     * $val  第一个参数是密码
     * $data 第二个参数是添加的数据(可选)
     */
    public function setPasswordAttr($val,$data){
        if($val === '') {
            return $val;
        }else{
            return md5($val.$data['email']);
        }
    }
}

Once, finalización automática del modelo modelo

Cuando se       agrega y actualiza auto, la
inserción de la matriz de atributos autocompletada     solo se agrega y la
actualización de la matriz de atributos autocompletada   solo se actualiza, la matriz de atributos autocompletada

1. Finalización automática 

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	//添加和修改时,都会自动完成的字段
    protected $auto = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }
}

2. Completar automáticamente al agregar datos 

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	// 新增 自动完成
    protected $insert = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }
}

3. Cuando los datos se actualizan, se completan automáticamente:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	// 更新 自动完成
    protected $update = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }
}

12. Complete automáticamente la marca de tiempo

En el archivo de configuración de la base de datos database.php, existe la siguiente configuración:

//自动写入时间戳字段
'auto_timestamp'  => false,
//如果开启(设置为true),则会自动完成所有表的时间戳,但是不建议这样,只在需要的地方设置更安全。

Por ejemplo, la marca de tiempo de la tabla de usuario se completa automáticamente, que se establece en el modelo de usuario:

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
    //开启自动完成时间戳功能
    protected $autoWriteTimestamp = true;
    //开启后,
    //添加数据时,默认自动完成的字段是:create_time和update_time
    //修改数据时,默认自动完成的字段是:update_time
    
    //如果数据表里不是这两个字段,则会报错。需要进行如下修改:
    protected $createTime = 'addtime';//修改默认的添加时间字段
    protected $updateTime = 'updtime';//修改默认的修改时间字段
    protected $updateTime = false;//当不需要这个字段时设置为false
}

Cuando se actualiza Thinkphp, el método para actualizar automáticamente la marca de tiempo del campo update_time:

1. Utilice la actualización


User::update(['name'='安阳'],['id'=>1]);

El código fuente del método de actualización en Thinkphp es el siguiente:

/**
    * 更新数据
    * @access public
    * @param array      $data  数据数组
    * @param array      $where 更新条件
    * @param array|true $field 允许字段
    * @return $this
    */
   public static function update($data = [], $where = [], $field = null)
   {
       $model = new static();
       if (!empty($field)) {
           $model->allowField($field);
       }
       $result = $model->isUpdate(true)->save($data, $where);
       return $model;
   }

2. Utilice guardar

$user=new User;
$user->isUpdate(true)->save(['name'='安阳'],['id'=>1]);

 

 

13. Eliminación temporal

¿Qué es la eliminación suave?

Al borrar algunos registros, a veces necesitamos hacer un borrado falso, solo modificando el estado de un determinado campo para marcar que el registro ha sido borrado, pero de hecho, estos registros aún existen en la base de datos. Todavía hay muchos escenarios de aplicaciones para la eliminación falsa, como el registro de colección de Alipay. Después de que lo eliminemos en la APLICACIÓN, ya no se mostrará. ¿Crees que realmente se eliminó y no dejará ningún rastro? No, no. Eliminar los registros de la colección de Alipay es simplemente una eliminación suave. En la base de datos de Alipay, estos registros de la colección se guardan realmente. Si se sospecha que su colección infringe las regulaciones o la ley, la policía aún puede pasar a la policía en línea de Alipay.

1. Activa la eliminación automática

<?php
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;//引入软删除的类

class Order extends Model{
    //使用软删除
    //删除时,默认更新的字段是delete_time
    use SoftDelete;
    //如果数据表里不是delete_time这个字段,则会报错。需要进行如下修改:
    protected $deleteTime = 'deltime';
}

2. Eliminación suave en el controlador y devuelve el número de filas afectadas

 $res = Order::destroy(1);
    

Una vez ejecutada la eliminación, el campo delete_time se actualizará. Si el campo update_time también está habilitado para la finalización automática, el campo update_time también se actualizará.

3. Si la eliminación suave está activada, debe eliminar los datos, en lugar de la eliminación suave, utilice el siguiente método

//destory()第二个参数传递true
$res = Order::destroy(1,true);

//delete()参数传递true
$orderData = Order::get(1);
$orderData ->delete(true);

4. Consultar los datos eliminados temporalmente

$res = Order::withTrashed(true)->find(1);

5. La consulta solo contiene datos que se han eliminado temporalmente.

$res = Order::onlyTrashed()->select();

 

Supongo que te gusta

Origin blog.csdn.net/qq15577969/article/details/113705451
Recomendado
Clasificación