Home PHP Framework ThinkPHP ThinkPHP: The second of three powerful tools for models (modifier)

ThinkPHP: The second of three powerful tools for models (modifier)

Dec 16, 2019 pm 05:01 PM
thinkphp modifier Model

ThinkPHP: The second of three powerful tools for models (modifier)

Modifier is one of the three major "tools" of the model. In this article, we will summarize the usage of the modifier and some precautions.

Define the modifier

The function of the modifier is to perform some necessary data processing before the model object data is written to the database. The standard definition of the modifier is as follows:

public function setFieldNameAttr($value, $data)
{
    // 对value值进行处理 data参数是当前全部数据
    // 返回值就是实际要写入数据库的值
    return $value;
}
Copy after login

FieldName corresponds to the field_name field of the data table (pay attention to the specifications of the data table fields and the definition specifications of the modifier method, otherwise it will cause errors).

In principle, each modifier should only process the data of the corresponding field, but it is allowed to process multiple fields at the same time if necessary.

The following is an example

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->setAttr('age', $age);
    return $birthday;
}
public function setAgeAttr($value,$data)
{
    return floor($value);
}
Copy after login

The reason why the setAttr method is used is to ensure that the age assignment operation can still go through a separate modifier. If you don’t have additional modifiers, you can also write it as

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->data['age'] = $age;
    return $birthday;
}
Copy after login

. Note that it must not be written as

$this->age = $age;
Copy after login

because assigning data objects inside the model will cause inefficiency due to confusion with the internal attributes of the model. foreseen consequences.

If you may modify other fields in a certain modifier, be sure to remember that the field modifier you need to modify additionally must have been assigned (or the modifier has been triggered).

How to call

The modifier method does not need to be called manually. After it is defined according to the definition specification, the system will automatically call it under the following circumstances:

·Model object assignment;

·Call the data method of the model, and the second parameter is passed in true;

·Call the save method of the model and pass in the array data;

·Explicitly call the setAttr method of the model;

· defines the automatic completion of this field;

For example, the User model defines setPasswordAttr modification device method.

public function setPasswordAttr($value, $data)
{
    return md5($value);
}
Copy after login

When used as follows, the value of the password field saved to the database will become the value after md5('think').

$user = User::get(1);
$user->password = 'think';
$user->save();
Copy after login

If you do not want to use modifiers but want to manually control the data in some cases, you can try the following method.

$user = User::get(1);
$user->data('password', md5('think'));
$user->save();
Copy after login

It will not be processed by the modifier at this time.

Avoid conflicts

Many developers like to define auto-complete auto (including insert and update) for modifiers.

protected $auto = ['password'];
Copy after login

This is a seemingly clever but very fatal mistake before V5.1.27. Try to avoid it because according to the modifier trigger conditions we gave before, it will cause the modifier to be executed twice. . This will be a catastrophic error and will cause all users to be unable to log in normally after registration.

Solution Cancel the automatic completion setting of the password field, because the modifier will be automatically triggered every time a value is assigned. If there is no assignment, it means that the password has not been modified, and there is no automatic completion.

Auto-complete fields are usually fields that are not in the form, and are generally fields that are automatically processed by the system.

The V5.1.27 version has improved this problem. All modifiers are only allowed to be executed once, and the above problem no longer exists. But it seems to have brought a new problem. Many times, you may want to modify the data in the event of the model.

User::beforeUpdate(function($user) {
    $user->password = md5('think');
});
Copy after login

You will find that in the model beforeUpdate event, the value of the data cannot be modified. The reason is that the model's modifier has been executed during the first assignment, and has been executed during the second assignment. Invalid (will not be executed again).

The solution is to use the data method as I mentioned before without calling the modifier for data assignment operations.

User::beforeUpdate(function($user) {
    $user->data('password', md5('think'));
});
Copy after login

Of course, a better suggestion is to plan the data processing mechanism of modifiers, auto-complete and model events. Do not use multiple mechanisms to modify data at the same time for a field, and the data written to the database should and only be modified. The data modification operation is performed through this method.

Type automatic conversion

If your modifier only performs type conversion on data, you don’t need to define a modifier, but just define the field type directly. .

public function setScoreAttr($value, $data)
{
    return (float) $score;
}
Copy after login

The above modifier method can be directly changed to

protected $type = [
    'score'    =>    'float',
];
Copy after login

If you define a modifier and type for a field at the same time, the modifier takes precedence.

Type definitions can not only define simple data types, but also have some additional uses. For example: json type, array type and object type will be JSON serialized, and the serialize type will serialize the data.

PHP Chinese website has a large number of free ThinkPHP introductory tutorials, everyone is welcome to learn!

This article is reproduced from: https://blog.thinkphp.cn/817548

The above is the detailed content of ThinkPHP: The second of three powerful tools for models (modifier). For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat Commands and How to Use Them
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

The world's most powerful open source MoE model is here, with Chinese capabilities comparable to GPT-4, and the price is only nearly one percent of GPT-4-Turbo The world's most powerful open source MoE model is here, with Chinese capabilities comparable to GPT-4, and the price is only nearly one percent of GPT-4-Turbo May 07, 2024 pm 04:13 PM

Imagine an artificial intelligence model that not only has the ability to surpass traditional computing, but also achieves more efficient performance at a lower cost. This is not science fiction, DeepSeek-V2[1], the world’s most powerful open source MoE model is here. DeepSeek-V2 is a powerful mixture of experts (MoE) language model with the characteristics of economical training and efficient inference. It consists of 236B parameters, 21B of which are used to activate each marker. Compared with DeepSeek67B, DeepSeek-V2 has stronger performance, while saving 42.5% of training costs, reducing KV cache by 93.3%, and increasing the maximum generation throughput to 5.76 times. DeepSeek is a company exploring general artificial intelligence

KAN, which replaces MLP, has been extended to convolution by open source projects KAN, which replaces MLP, has been extended to convolution by open source projects Jun 01, 2024 pm 10:03 PM

Earlier this month, researchers from MIT and other institutions proposed a very promising alternative to MLP - KAN. KAN outperforms MLP in terms of accuracy and interpretability. And it can outperform MLP running with a larger number of parameters with a very small number of parameters. For example, the authors stated that they used KAN to reproduce DeepMind's results with a smaller network and a higher degree of automation. Specifically, DeepMind's MLP has about 300,000 parameters, while KAN only has about 200 parameters. KAN has a strong mathematical foundation like MLP. MLP is based on the universal approximation theorem, while KAN is based on the Kolmogorov-Arnold representation theorem. As shown in the figure below, KAN has

Hello, electric Atlas! Boston Dynamics robot comes back to life, 180-degree weird moves scare Musk Hello, electric Atlas! Boston Dynamics robot comes back to life, 180-degree weird moves scare Musk Apr 18, 2024 pm 07:58 PM

Boston Dynamics Atlas officially enters the era of electric robots! Yesterday, the hydraulic Atlas just "tearfully" withdrew from the stage of history. Today, Boston Dynamics announced that the electric Atlas is on the job. It seems that in the field of commercial humanoid robots, Boston Dynamics is determined to compete with Tesla. After the new video was released, it had already been viewed by more than one million people in just ten hours. The old people leave and new roles appear. This is a historical necessity. There is no doubt that this year is the explosive year of humanoid robots. Netizens commented: The advancement of robots has made this year's opening ceremony look like a human, and the degree of freedom is far greater than that of humans. But is this really not a horror movie? At the beginning of the video, Atlas is lying calmly on the ground, seemingly on his back. What follows is jaw-dropping

There are several versions of thinkphp There are several versions of thinkphp Apr 09, 2024 pm 06:09 PM

ThinkPHP has multiple versions designed for different PHP versions. Major versions include 3.2, 5.0, 5.1, and 6.0, while minor versions are used to fix bugs and provide new features. The latest stable version is ThinkPHP 6.0.16. When choosing a version, consider the PHP version, feature requirements, and community support. It is recommended to use the latest stable version for best performance and support.

FisheyeDetNet: the first target detection algorithm based on fisheye camera FisheyeDetNet: the first target detection algorithm based on fisheye camera Apr 26, 2024 am 11:37 AM

Target detection is a relatively mature problem in autonomous driving systems, among which pedestrian detection is one of the earliest algorithms to be deployed. Very comprehensive research has been carried out in most papers. However, distance perception using fisheye cameras for surround view is relatively less studied. Due to large radial distortion, standard bounding box representation is difficult to implement in fisheye cameras. To alleviate the above description, we explore extended bounding box, ellipse, and general polygon designs into polar/angular representations and define an instance segmentation mIOU metric to analyze these representations. The proposed model fisheyeDetNet with polygonal shape outperforms other models and simultaneously achieves 49.5% mAP on the Valeo fisheye camera dataset for autonomous driving

Tesla robots work in factories, Musk: The degree of freedom of hands will reach 22 this year! Tesla robots work in factories, Musk: The degree of freedom of hands will reach 22 this year! May 06, 2024 pm 04:13 PM

The latest video of Tesla's robot Optimus is released, and it can already work in the factory. At normal speed, it sorts batteries (Tesla's 4680 batteries) like this: The official also released what it looks like at 20x speed - on a small "workstation", picking and picking and picking: This time it is released One of the highlights of the video is that Optimus completes this work in the factory, completely autonomously, without human intervention throughout the process. And from the perspective of Optimus, it can also pick up and place the crooked battery, focusing on automatic error correction: Regarding Optimus's hand, NVIDIA scientist Jim Fan gave a high evaluation: Optimus's hand is the world's five-fingered robot. One of the most dexterous. Its hands are not only tactile

How to run thinkphp How to run thinkphp Apr 09, 2024 pm 05:39 PM

Steps to run ThinkPHP Framework locally: Download and unzip ThinkPHP Framework to a local directory. Create a virtual host (optional) pointing to the ThinkPHP root directory. Configure database connection parameters. Start the web server. Initialize the ThinkPHP application. Access the ThinkPHP application URL and run it.

Single card running Llama 70B is faster than dual card, Microsoft forced FP6 into A100 | Open source Single card running Llama 70B is faster than dual card, Microsoft forced FP6 into A100 | Open source Apr 29, 2024 pm 04:55 PM

FP8 and lower floating point quantification precision are no longer the "patent" of H100! Lao Huang wanted everyone to use INT8/INT4, and the Microsoft DeepSpeed ​​team started running FP6 on A100 without official support from NVIDIA. Test results show that the new method TC-FPx's FP6 quantization on A100 is close to or occasionally faster than INT4, and has higher accuracy than the latter. On top of this, there is also end-to-end large model support, which has been open sourced and integrated into deep learning inference frameworks such as DeepSpeed. This result also has an immediate effect on accelerating large models - under this framework, using a single card to run Llama, the throughput is 2.65 times higher than that of dual cards. one

See all articles