라벨 모델 팁
위의 코드는 좋아 보이지만 실제로는 n 1 문제를 일으 킵니다. 데이터베이스에 100 개의 게시물이 있다고 가정합니다. 첫 번째 줄에서는 모든 게시물을 얻기 위해 단일 쿼리를 실행합니다. 그런 다음 에 액세스하는 루프에서 새 쿼리가 트리거되어 게시물 사용자가 추가로 제공됩니다. 이는 총 101 개의 쿼리를 실행한다는 것을 의미합니다. 당신이 상상할 수 있듯이, 이것은 좋지 않습니다! 응용 프로그램이 느려지고 데이터베이스에 불필요한 압력 을가합니다.
고맙게도 Laravel은 이러한 N 1 문제를 발견하고 예방하는 데 도움이되는 편리한
방법을 제공합니다. 이 방법은 LaRavel에게 게으른 관계를 적재 할 때 예외를 던지도록 지시하므로 관계가 항상 열심히로드되도록 할 수 있습니다.이 메소드를 사용하려면 메소드 호출을 클래스에 추가하십시오 : .
예외가 발생합니다.
이 문제를 해결하기 위해 게시물을 얻을 때 사용자 관계를 간절히로드하기 위해 코드를 업데이트 할 수 있습니다. 방법을 사용하여 다음을 달성 할 수 있습니다1 2 3 4 5 6 7 8 |
|
필드가 있다고 생각할 수도 있습니다.
모델을 가지고 있다고 가정 해
full_name
name
AppModelsUser
-
id
-
name
-
다음 코드를 실행하면 어떻게됩니까? : email
- 필드가 실제로
password
이거나 데이터베이스에서 필드를 얻지 못했거나 필드가 모델에 존재하지 않기 때문인지 알 수 없습니다. 당신이 상상할 수 있듯이, 이것은 예기치 않은 행동으로 이어질 수 있으며 때로는 감지하기 어려울 수 있습니다.
Laravel 은이 문제를 예방하는 데 사용할 수있는 - 메소드를 제공합니다. 이 방법은 Laravel에게 모델의 현재 인스턴스에 존재하지 않는 필드에 액세스하려고 할 때 예외를 던지도록 지시합니다.
created_at
이 기능을 활성화하려면 메소드 호출을 클래스에 추가하십시오 : .
-
이제 샘플 코드를 실행하고 모델의 updated_at
필드에 액세스하려고하면 다음 메시지와 함께 예외가 발생합니다.
1 2 3 4 5 6 7 8 |
|
메소드가 Laravel Documentation (Commit)에서 제거되었지만 여전히 작동한다는 점에 주목할 가치가 있습니다. 왜 그것이 제거되었는지 잘 모르겠지만주의의 문제입니다. 이것은 미래에 삭제 될 것임을 나타낼 수 있습니다. full_name
$name
(다음 내용은 원본 텍스트와 동일합니다. 일관성을 유지하기 위해 원본 텍스트를 유지하고 더 이상 다시 쓰지 않습니다) .
방법을 제공합니다. preventAccessingMissingAttributes
AppModelsUser
1 2 3 4 5 6 7 8 |
|
메소드를 사용할 수 있습니다.이 메소드는 존재하지 않거나 모델에서 채울 수없는 필드를 업데이트하려고 할 때 예외를 던집니다. name
이 메소드를 사용하려면 메소드 호출을 클래스에 추가하십시오 : .
email
password
email_verified_at
위 코드에서 필드는 데이터베이스에 존재하지 않으므로 Laravel은 우리를 위해이를 캡처하지 않고 데이터베이스 수준에서 캡처합니다. MySQL 데이터베이스를 사용하는 경우 다음과 같은 오류가 표시됩니다.
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">namespace App\Providers;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Model::preventLazyLoading();
}
}</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>
<ict> 엄격한 모델 모드
<to> 앞에서 언급 한 세 가지 메소드를 사용하려면 메소드를 사용하여 한 번에 활성화 할 수 있습니다. 이 메소드는 <ables ables>, <p> 및 <code>full_name
설정을 활성화합니다. email_verified_at
이 메소드를 사용하려면 메소드 호출을 클래스에 추가하십시오 : .
1 2 3 4 5 6 7 8 |
|
메소드는 Laravel 문서 (Commit)에서 제거되었지만 여전히 작동합니다. 이것은 미래에 삭제 될 것임을 나타낼 수 있습니다. preventAccessingMissingAttributes
UUID 사용
당신은 UUID를 모델의 주요 키로 사용하고 싶을 수도 있습니다. 또는 응용 프로그램 및 데이터베이스의 관계를 정의하기 위해 자동 증가 ID를 유지하지만 공개 ID에는 UUID를 사용하여 자동 증가 된 ID를 유지할 수 있습니다. 이 접근법을 사용하면 공격자가 다른 리소스의 ID를 추측하기가 더 어려워서 추가 보안 계층을 추가 할 수 있습니다.
예를 들어 라우팅에서 자동 인상 ID를 사용한다고 가정 해 봅시다. 아래와 같이 사용자에게 액세스하기위한 경로가있을 수 있습니다.
등)를 통해 다른 사용자의 프로파일에 액세스하려고 시도 할 수 있습니다. 그리고 UUID를 사용하면 URL은 1fa24c18-39fd-4ff2-8f23-74ccd08462b0
,
1 2 3 4 5 6 7 8 9 10 11 12 |
|
/users/1
테이블의 기본 마이그레이션을 만들었다고 가정 해
/users/2
우리가 마이그레이션에서 보았 듯이, 우리는 UUID 필드를 정의했습니다. 기본적 으로이 필드는 라고 불리며, 원하는 경우 열 이름을 /users/3
메소드로 전달하여 변경할 수 있습니다. /users/1fa24c18-39fd-4ff2-8f23-74ccd08462b0
/users/b807d48d-0d01-47ae-8bbc-59b2acea6ed3
필드를 모델의 주요 키로 사용하도록 지시해야합니다. 또한 Laravel이 자동으로 UUID를 생성 할 수있는 기능을 추가해야합니다. 우리는 모델의 /users/ec1dde93-c67a-4f14-8464-c0d29c95425f
속성을 덮어 쓰고
1 2 3 4 5 6 7 8 |
|
필드가 UUID로 채워져 있음을 알 수 있습니다. uuid
필드가 있다고 가정합니다. 우리는
속성을 정의 할 필요가 없습니다.
id
uuid
필드가 uuid로 채워져 있음을 알 수 있습니다.
id
$primaryKey
ulid를 사용하십시오
Laravel 모델에서 UUID를 사용하는 것과 유사하게, 때로는 ULID (Universal Cight Dictionary Sort Identifier)를 사용하고 싶을 수도 있습니다.
. IlluminateDatabaseEloquentConcernsHasUuids
uniqueIds
기능을 사용하여
예를 들어, AppModelsComment
uuid
1 2 3 4 5 6 7 8 9 10 11 12 |
|
uuid
예를 들어,
필드를 사용할 수 있습니다. uuid
마찬가지로, 블로그를 작성하는 경우 id
필드 대신 필드를 기반으로 게시물을 얻을 수 있습니다. 이는 필드를 읽기 쉽고 자동 증가 된 ID보다 SEO 친화적이기 때문입니다.
메소드를 정의하여이를 수행 할 수 있습니다. 이 방법은 라우팅 모델 바인딩에 사용하려는 필드의 이름을 반환해야합니다. slug
예를 들어, 필드 대신 필드를 사용하기 위해 모델에 대한 모든 라우팅 모델 바인딩을 변경하려고한다고 가정 해 봅시다. 우리는 모델에 id
메소드를 추가하여이를 수행 할 수 있습니다 :
slug
getRouteKeyName
필드를 사용하려면 다른 모든 경로에서
AppModelsPost
구문을 사용하여이를 수행 할 수 있습니다. 예를 들어, 라우팅 모델 바인딩 경로에서 slug
필드를 사용한다고 가정 해 봅시다. 우리는 다음과 같이 경로를 정의 할 수 있습니다
id
Post
필드와 함께 데이터베이스에서 게시물을 얻으려고한다는 것을 의미합니다. getRouteKeyName
사용자 정의 모델 컬렉션 사용
1 2 3 4 5 6 7 8 |
|
AppModelsPost
우리는 새로운 파일을 만들고 사용자 정의 컬렉션 클래스를 다음과 같이 정의 할 수 있습니다.
AppCollectionsPostCollection
클래스를 만들었습니다. 또한이 컬렉션에는 docBlock을 사용하여 app/Collections/PostCollection.php
클래스의 인스턴스 만 포함하도록 지정했습니다. 이는 IDE가 컬렉션에 포함될 데이터 유형을 이해하도록 돕는 데 유용합니다.
1 2 3 4 5 6 7 8 |
|
이 예에서는 모델 배열을 메소드로 전달하고 사용자 정의 AppCollectionsPostCollection
를 사용하지 않아야합니다. AppModelsPost
가 객체를 비교할 때 확인하면 동일한 객체의 인스턴스인지 확인하기 때문입니다. 이것은 두 모델이 동일한 데이터를 가지고 있더라도 다른 인스턴스 인 경우 동일하게 간주되지 않음을 의미합니다. 따라서 newCollection
가 반환 될 가능성이 높기 때문에이 작업을 피해야합니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
newCollection
를 사용하지 않아야합니다. 이는 객체를 비교할 때 AppModelsPost
를 점검하면 동일한 클래스의 인스턴스 여부와 동일한 속성과 값이 있는지 확인하기 때문입니다. 그러나 이것은 예상치 못한 행동으로 이어질 수 있습니다. AppCollectionsPostCollection
가 동일한 클래스이고 동일한 속성과 값을 갖기 때문에 를 반환합니다. 그러나 우리가 모델의 속성을 변경하여 다르게 만들면 어떻게됩니까?
1 |
|
테이블에서 및
필드 만 가져 오도록하겠습니다.1 2 3 4 5 6 7 8 |
|
가 와 동일하더라도 는 모델에 다른로드 된 속성이 있기 때문에 검사는 $comment->post
를 반환합니다. 당신이 상상할 수 있듯이, 이것은 추적하기 어려운 이해할 수없는 행동으로 이어질 수 있습니다. 특히 $post
메소드를 쿼리에 소급 적으로 추가하고 테스트가 실패하기 시작한 경우. ==
false
메소드를 사용하는 것을 좋아합니다. 이 방법은 두 모델을 비교하고 동일한 클래스에 속하는지 확인하고 동일한 기본 키 값을 갖고 동일한 데이터베이스 연결이 있는지 확인합니다. 이것은 모델을 비교하는 안전한 방법이며 예상치 못한 행동의 가능성을 줄이는 데 도움이됩니다. select
is
메소드를 사용하여 두 모델이 다른지 확인할 수 있습니다.
isNot
is
를 사용하십시오
1 2 3 4 5 6 7 8 9 10 11 12 |
|
메소드를 제공합니다 (내 의견으로는). 이 방법을 사용하면 위의 쿼리를 다음과 같이 다시 작성할 수 있습니다.
isNot
1 |
|
whereBelongsTo
결론
이 기사에서 Laravel 모델을 사용하기위한 몇 가지 새로운 팁을 보여주기를 바랍니다. 이제 N 1 문제를 발견하고 방지하고, 누락 된 속성에 대한 액세스를 방지하고, 조용히 버려지는 속성을 방지하며, 기본 키 유형을 UUID 또는 ULID로 변경하십시오. 또한 라우팅 모델 바인딩에 사용되는 필드를 변경하는 방법을 알고, 컬렉션 유형을 지정하고, 모델을 비교하고, 쿼리를 구축 할 때
를 사용하십시오. 위 내용은 라벨 모델 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP에서 Password_hash 및 Password_Verify 기능을 사용하여 보안 비밀번호 해싱을 구현해야하며 MD5 또는 SHA1을 사용해서는 안됩니다. 1) Password_hash는 보안을 향상시키기 위해 소금 값이 포함 된 해시를 생성합니다. 2) Password_verify 암호를 확인하고 해시 값을 비교하여 보안을 보장합니다. 3) MD5 및 SHA1은 취약하고 소금 값이 부족하며 현대 암호 보안에는 적합하지 않습니다.

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.
