PHP 프레임워크 ThinkPHP ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

Dec 16, 2019 pm 05:17 PM
thinkphp 모델 얻는 사람

ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

getter 정의

getter의 기능은 모델 객체의 (원시) 데이터를 자동으로 처리하는 것입니다. getter는 모델의 특수 메소드에 해당합니다(메소드는 공개 유형이어야 함). 메소드 명명 규칙은 다음과 같습니다.

getFieldNameAttr

FieldName은 데이터 테이블 필드 또는 그렇지 않은 필드의 카멜 케이스 변환입니다. 데이터 테이블에 존재하는 경우(다음 문장을 이해해야 함) 다음은 일반적인 getter 정의입니다.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getUserTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$value];
    }
}
로그인 후 복사

출력 변환 처리가 필요한 각 데이터 필드에 대해 해당 getter를 정의해야 하지만 필드 이름은 getter는 데이터 테이블의 필드와 동일할 필요는 없습니다. 이름은 일관됩니다. 예를 들어, user_type 필드에 대해 getTypeAttr이라는 getter를 정의하려는 경우에도 허용됩니다. 이때 getter에 전달되는 첫 번째 매개변수에는 값이 없어야 합니다(해당하는 데이터 테이블 필드 데이터가 없기 때문). 두 번째 매개변수를 통해서만 필요한 데이터를 얻을 수 있습니다.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$data[&#39;user_type&#39;]];
    }
}
로그인 후 복사

물론 더 엄격한 경우에는 $data['user_type']가 존재하는지 여부도 확인해야 하며 지금은 건너뜁니다.

두 번째 매개변수의 데이터 데이터 자체가 getter에 의해 처리되었을 수 있다는 점에 유의하세요(관련 getter를 정의한 경우).

데이터그램 필드와 일치하지 않는 getter를 정의해야 하는 이유는 무엇입니까? 가장 확실한 이점은 다양한 필드를 구별하여 원시 데이터와 처리된 데이터를 얻을 수 있다는 것입니다. 실제로 데이터 테이블에 존재하지 않는 일부 필드 게터를 정의하는 데는 여러 가지 이유가 있습니다. 이것이 바로 게터의 매력입니다.

게터의 정의 자체는 어렵지 않다고 볼 수 있는데, 핵심은 실제 응용에서 가장 주목해야 할 메소드의 획득 로직에 있습니다.

Getter 호출

getter를 정의한 후 다음 상황에서 자동으로 트리거됩니다.

·모델의 데이터 개체 값 작업(예: $model->field_name);

· 모델의 직렬화된 출력 작업(예: $model->toArray() 또는 toJson())

· 명시적으로 getAttr 메서드(예: $model-> getAttr('field_name'));

처음 두 개는 실제로 마지막 항목을 호출하여 구현됩니다. 가장 중요한 것은 첫 번째 항목을 이해하는 것입니다. 위의 방법을 사용하여 모델 객체 데이터를 얻거나 템플릿을 출력할 때 실제로는 다음과 같은 순서로 데이터를 감지하고 얻습니다.

·1단계 - 쿼리 결과에 필드 데이터가 포함된 경우 원본 데이터를 검색하고, 그렇지 않으면 2단계로 이동합니다.

·2단계 - 필드가 Getter(동적 포함)로 정의되었는지 확인합니다. getter), 있는 경우 getter를 호출하여 결과를 반환하고, 그렇지 않은 경우 3단계로 이동합니다.

·3단계 - 필드의 유형 변환이 정의되어 있는지 확인하고, 그렇다면 변환을 진행합니다. 처리하고 결과를 반환합니다. 그렇지 않으면 4단계로 이동합니다.

·4단계 - 시스템의 시간 필드인 경우 자동으로 시간 형식을 수행하고 결과를 반환합니다. 그렇지 않으면 5단계로 이동합니다. ·

5단계 - 1단계 확인에서 필드 데이터가 포함되지 않은 경우 연관된 속성 정의가 있는지 확인하고, 그렇다면 연관된 관계를 통해 데이터를 얻어서 결과를 반환하고, 그렇지 않으면 정의되지 않은 속성을 반환합니다. 비정상적으로 던져지게 됩니다.

위 5단계의 세부 코드는 관심 있는 분들은 thinkmodelconcernAttribute의 getAttr 메소드 코드를 직접 참고하시면 됩니다.

간단히 $user->user_type을 받으면 user_type 필드가 실제 데이터 테이블 필드인지 여부에 관계없이 해당 getter가 정의되어 있는지 확인하게 됩니다.

하지만 모델 데이터를 하나씩 가져오지 않고 전체 모델 데이터를 클라이언트나 템플릿으로 반환하는 경우가 많습니다.

$user = User::get(1);
echo $user->name;
echo $user->user_type;
로그인 후 복사
이 경우 출력에 응답할 때 모델의 toJson 처리가 실제로 수행됩니다.

한 가지 중요한 점은 getter가 데이터 테이블이 아닌 필드를 정의하는 경우 해당 필드가 자동으로 출력되지 않는다는 것입니다. 추가 메소드를 통해 추가 속성을 추가해야 합니다(그리고 관련 모델 속성 추가를 지원해야 합니다).

type 속성에 대한 getter를 정의하는 경우(실제 데이터 테이블 필드가 아니라고 가정) 다음 방법을 사용하여 정상적으로 출력해야 합니다(그렇지 않으면 user_type 데이터만 있을 수 있음):

public function index()
{
    $user = User::get(1);
    return json($user);
}
로그인 후 복사

toArray를 사용해도 처리는 동일합니다.

데이터 세트 쿼리인 경우 추가 필드를 균일하게 추가하기 위해 추가 메서드를 사용할 수도 있습니다.

public function index()
{
    $user = User::get(1);
    return json($user->append([&#39;type&#39;]));
}
로그인 후 복사

append 방식 외에도 숨겨진 방식을 사용하여 일부 데이터를 일시적으로 숨기는 기능도 지원합니다.

원시 데이터 가져오기

有些情况下,除了要获取处理过的数据外,还需要获取原始数据以便应对不同的需求。

如果你的获取器都是用的区分于实际数据表字段的额外属性字段,那么这个问题本身已经解决了。所以我们主要讨论的是当你的获取器属性和数据表字段一致的情况下,该如何获取原始数据。

一个最简单的办法是使用getData方法:

$user = User::get(1);
// 获取user_type获取器数据
echo $user->user_type;
// 获取原始的user_type数据
echo $user->getData(&#39;user_type&#39;);
// 获取全部原始数据
dump($user->getData());
로그인 후 복사

动态获取器

前面我们提到过动态获取器的概念,动态获取器就是不需要在模型类里面定义获取器方法,而是在查询的时候使用闭包来定义一个字段的获取器对数据进行统一的处理。

User::withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();
로그인 후 복사

如果你需要定义多个动态获取器,多次调用withAttr方法就行。

动态获取器的意义除了可以不用在模型里面定义获取器方法之外,还可以起到覆盖已经定义的获取器的作用,并且动态获取器可以支持Db类操作,弥补了Db操作不能使用获取器的缺憾,具体就看自己的需求来选择了。

Db::name(&#39;user&#39;)->withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();
로그인 후 복사

总结

无论是获取器,还是之前提的修改器、搜索器,其作用无非是把你的模型工作细化和拆分,这样代码和逻辑也会更清晰,可维护性也大大增强,至于性能,从来不是模型首先考虑的。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/825350

위 내용은 ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

세계에서 가장 강력한 오픈 소스 MoE 모델이 여기에 있습니다. 중국의 기능은 GPT-4와 비슷하며 가격은 GPT-4-Turbo의 거의 1%에 불과합니다. 세계에서 가장 강력한 오픈 소스 MoE 모델이 여기에 있습니다. 중국의 기능은 GPT-4와 비슷하며 가격은 GPT-4-Turbo의 거의 1%에 불과합니다. May 07, 2024 pm 04:13 PM

기존 컴퓨팅을 능가할 뿐만 아니라 더 낮은 비용으로 더 효율적인 성능을 달성하는 인공 지능 모델을 상상해 보세요. 이것은 공상과학 소설이 아닙니다. DeepSeek-V2[1], 세계에서 가장 강력한 오픈 소스 MoE 모델이 여기에 있습니다. DeepSeek-V2는 경제적인 훈련과 효율적인 추론이라는 특징을 지닌 전문가(MoE) 언어 모델의 강력한 혼합입니다. 이는 236B 매개변수로 구성되며, 그 중 21B는 각 마커를 활성화하는 데 사용됩니다. DeepSeek67B와 비교하여 DeepSeek-V2는 더 강력한 성능을 제공하는 동시에 훈련 비용을 42.5% 절감하고 KV 캐시를 93.3% 줄이며 최대 생성 처리량을 5.76배로 늘립니다. DeepSeek은 일반 인공지능을 연구하는 회사입니다.

안녕하세요, 일렉트릭 아틀라스입니다! 보스턴 다이나믹스 로봇 부활, 180도 이상한 움직임에 겁먹은 머스크 안녕하세요, 일렉트릭 아틀라스입니다! 보스턴 다이나믹스 로봇 부활, 180도 이상한 움직임에 겁먹은 머스크 Apr 18, 2024 pm 07:58 PM

Boston Dynamics Atlas가 공식적으로 전기 로봇 시대에 돌입했습니다! 어제 유압식 Atlas가 역사의 무대에서 "눈물을 흘리며" 물러났습니다. 오늘 Boston Dynamics는 전기식 Atlas가 작동 중이라고 발표했습니다. 상업용 휴머노이드 로봇 분야에서는 보스턴 다이내믹스가 테슬라와 경쟁하겠다는 각오를 다진 것으로 보인다. 새 영상은 공개된 지 10시간 만에 이미 100만 명이 넘는 조회수를 기록했다. 옛 사람들은 떠나고 새로운 역할이 등장하는 것은 역사적 필연이다. 올해가 휴머노이드 로봇의 폭발적인 해라는 것은 의심의 여지가 없습니다. 네티즌들은 “로봇의 발전으로 올해 개막식도 인간처럼 생겼고, 자유도도 인간보다 훨씬 크다. 그런데 정말 공포영화가 아닌가?”라는 반응을 보였다. 영상 시작 부분에서 아틀라스는 바닥에 등을 대고 가만히 누워 있는 모습입니다. 다음은 입이 떡 벌어지는 내용이다

MLP를 대체하는 KAN은 오픈소스 프로젝트를 통해 컨볼루션으로 확장되었습니다. MLP를 대체하는 KAN은 오픈소스 프로젝트를 통해 컨볼루션으로 확장되었습니다. Jun 01, 2024 pm 10:03 PM

이달 초 MIT와 기타 기관의 연구자들은 MLP에 대한 매우 유망한 대안인 KAN을 제안했습니다. KAN은 정확성과 해석성 측면에서 MLP보다 뛰어납니다. 그리고 매우 적은 수의 매개변수로 더 많은 수의 매개변수를 사용하여 실행되는 MLP보다 성능이 뛰어날 수 있습니다. 예를 들어 저자는 KAN을 사용하여 더 작은 네트워크와 더 높은 수준의 자동화로 DeepMind의 결과를 재현했다고 밝혔습니다. 구체적으로 DeepMind의 MLP에는 약 300,000개의 매개변수가 있는 반면 KAN에는 약 200개의 매개변수만 있습니다. KAN은 MLP와 같이 강력한 수학적 기반을 가지고 있으며, KAN은 Kolmogorov-Arnold 표현 정리를 기반으로 합니다. 아래 그림과 같이 KAN은

thinkphp에는 여러 버전이 있습니다. thinkphp에는 여러 버전이 있습니다. Apr 09, 2024 pm 06:09 PM

ThinkPHP에는 다양한 PHP 버전용으로 설계된 여러 버전이 있습니다. 메이저 버전에는 3.2, 5.0, 5.1, 6.0이 포함되며, 마이너 버전은 버그를 수정하고 새로운 기능을 제공하는 데 사용됩니다. 최신 안정 버전은 ThinkPHP 6.0.16입니다. 버전을 선택할 때 PHP 버전, 기능 요구 사항 및 커뮤니티 지원을 고려하십시오. 최상의 성능과 지원을 위해서는 최신 안정 버전을 사용하는 것이 좋습니다.

FisheyeDetNet: 어안 카메라를 기반으로 한 최초의 표적 탐지 알고리즘 FisheyeDetNet: 어안 카메라를 기반으로 한 최초의 표적 탐지 알고리즘 Apr 26, 2024 am 11:37 AM

표적 탐지는 자율주행 시스템에서 상대적으로 성숙한 문제이며, 그 중 보행자 탐지는 가장 먼저 배포되는 알고리즘 중 하나입니다. 대부분의 논문에서 매우 포괄적인 연구가 수행되었습니다. 그러나 서라운드 뷰를 위한 어안 카메라를 사용한 거리 인식은 상대적으로 덜 연구되었습니다. 큰 방사형 왜곡으로 인해 표준 경계 상자 표현은 어안 카메라에서 구현하기 어렵습니다. 위의 설명을 완화하기 위해 확장된 경계 상자, 타원 및 일반 다각형 디자인을 극/각 표현으로 탐색하고 인스턴스 분할 mIOU 메트릭을 정의하여 이러한 표현을 분석합니다. 제안된 다각형 형태의 모델 fisheyeDetNet은 다른 모델보다 성능이 뛰어나며 동시에 자율 주행을 위한 Valeo fisheye 카메라 데이터 세트에서 49.5% mAP를 달성합니다.

공장에서 일하는 테슬라 로봇, 머스크 : 올해 손의 자유도가 22도에 달할 것! 공장에서 일하는 테슬라 로봇, 머스크 : 올해 손의 자유도가 22도에 달할 것! May 06, 2024 pm 04:13 PM

테슬라의 로봇 옵티머스(Optimus)의 최신 영상이 공개됐는데, 이미 공장에서 작동이 가능한 상태다. 정상 속도에서는 배터리(테슬라의 4680 배터리)를 다음과 같이 분류합니다. 공식은 또한 20배 속도로 보이는 모습을 공개했습니다. 작은 "워크스테이션"에서 따고 따고 따고 : 이번에 출시됩니다. 영상에는 옵티머스가 공장에서 이 작업을 전 과정에 걸쳐 사람의 개입 없이 완전히 자율적으로 완료하는 모습이 담겨 있습니다. 그리고 Optimus의 관점에서 보면 자동 오류 수정에 중점을 두고 구부러진 배터리를 집어 넣을 수도 있습니다. NVIDIA 과학자 Jim Fan은 Optimus의 손에 대해 높은 평가를 했습니다. Optimus의 손은 세계의 다섯 손가락 로봇 중 하나입니다. 가장 능숙합니다. 손은 촉각적일 뿐만 아니라

thinkphp를 실행하는 방법 thinkphp를 실행하는 방법 Apr 09, 2024 pm 05:39 PM

ThinkPHP Framework를 로컬에서 실행하는 단계: ThinkPHP Framework를 로컬 디렉터리에 다운로드하고 압축을 풉니다. ThinkPHP 루트 디렉터리를 가리키는 가상 호스트(선택 사항)를 만듭니다. 데이터베이스 연결 매개변수를 구성합니다. 웹 서버를 시작합니다. ThinkPHP 애플리케이션을 초기화합니다. ThinkPHP 애플리케이션 URL에 접속하여 실행하세요.

단일 카드는 듀얼 카드보다 Llama를 70B 더 빠르게 실행합니다. Microsoft는 A100에 FP6을 넣었습니다 | 단일 카드는 듀얼 카드보다 Llama를 70B 더 빠르게 실행합니다. Microsoft는 A100에 FP6을 넣었습니다 | Apr 29, 2024 pm 04:55 PM

FP8 이하의 부동 소수점 수량화 정밀도는 더 이상 H100의 "특허"가 아닙니다! Lao Huang은 모든 사람이 INT8/INT4를 사용하기를 원했고 Microsoft DeepSpeed ​​팀은 NVIDIA의 공식 지원 없이 A100에서 FP6을 실행하기 시작했습니다. 테스트 결과에 따르면 A100에 대한 새로운 방법 TC-FPx의 FP6 양자화는 INT4에 가깝거나 때로는 더 빠르며 후자보다 정확도가 더 높은 것으로 나타났습니다. 또한 오픈 소스로 제공되고 DeepSpeed와 같은 딥 러닝 추론 프레임워크에 통합된 엔드투엔드 대규모 모델 지원도 있습니다. 이 결과는 대형 모델 가속화에도 즉각적인 영향을 미칩니다. 이 프레임워크에서는 단일 카드를 사용하여 Llama를 실행하면 처리량이 듀얼 카드보다 2.65배 더 높습니다. 하나

See all articles