코드 가독성을 향상시키는 데 도움이 되는 6가지 Laravel Eloquent 팁!

青灯夜游
풀어 주다: 2022-11-15 20:08:01
앞으로
1864명이 탐색했습니다.

이 글은 코드 가독성을 향상시킬 수 있는 6가지 Laravel Eloquent 팁을 모아서 공유합니다. 모든 사람에게 도움이 되기를 바랍니다!

코드 가독성을 향상시키는 데 도움이 되는 6가지 Laravel Eloquent 팁!

Eloquent는 Laravel이 기본적으로 사용하는 ORM입니다. 활성 녹화 모드가 사용됩니다. 더 쉬운 방법으로 데이터베이스와 상호 작용할 수 있습니다. 각 개별 모델은 작업할 수 있는 데이터베이스의 테이블을 나타냅니다. 이 기사에서는 코드 개선을 위해 여러분이 알지 못할 수도 있는 숨겨진 비밀, 메서드 및 속성을 다소간 보여 드리겠습니다.

Snake 명명 속성

Snake 명명 속성은 흥미로운 속성입니다. 코드 내용을 살펴보겠습니다.

/**
 * 指示是否在数组上使用蛇形大小写属性。
 *
 * @var bool
 */
public static $snakeAttributes = true;
로그인 후 복사

사람들은 종종 이 속성을 잘못 사용하여 속성에 액세스하는 방식을 변경합니다. 많은 사람들은 이 속성을 변경하면 camelCase 주석을 사용하여 속성에 쉽게 액세스할 수 있다고 생각합니다. 이것은 사실이 아닙니다. 사용하지 않는 것이 좋습니다. 모델이 배열로 출력될 때 속성이 camelCase인지 SnakeCase인지 정의하면 됩니다.

CamelCase 이름 지정을 기본으로 하고 싶다면 Kirk Bushell의 패키지 Eloquence를 확인하는 것이 좋습니다.

Pagination

Laravel의 Eloquent ORM을 사용하는 경우 이는 좋은 소식입니다. 즉시 사용 가능한 페이지 매김 방법을 제공합니다. 다음과 같은 글쓰기에 익숙할 것입니다:

$comments = Comment::paginate(20);
로그인 후 복사

이 방법을 사용하면 페이지당 20개의 항목으로 주석 모델의 페이지를 매길 수 있습니다. 페이지당 표시되는 항목 수를 정의하려면 이 값을 변경합니다. 아무것도 지정하지 않으면 기본값인 15가 적용됩니다.

웹사이트의 여러 위치에 리뷰를 표시하고 싶다고 가정해 보세요. 페이지당 댓글은 항상 30개입니다. 매개변수 30을 모든 곳에서 전달해야 한다면 문제가 됩니다. 따라서 모델에서 직접 새로운 기본값을 설정할 수 있습니다.

protected $perPage = 30;
로그인 후 복사

모델에 사용자 정의 값 추가

Eloquent에는 "접속자"라는 강력한 기능이 있습니다. 이 기능을 사용하면 모델에 존재하지 않는 모델이나 테이블에 사용자 정의 필드를 추가할 수 있습니다. 기존 값을 사용하거나 완전히 새로운 값을 정의하는 것은 중요하지 않으며 언제든지 대체할 수 있습니다. 다음은 접근자가 작동하는 방식의 예입니다. user라는 모델이 있다고 가정하고 여기에 FullName 접근자를 추가합니다.user的模型,我们给他添加一个FullName的访问器:

function getFullNameAttribute() {
    return sprintf('%s %s', $this->first_name, $this->last_name);
}
로그인 후 복사

现在你可以访问post模型上的full_name属性,如下:

User::latest()->first()->full_name;
로그인 후 복사

如果返回对象(如集合),则此属性不会附加到用户模型。将protected$appends属性添加到模型中。它接受一个数组,其中包含一个或多个字段,从现在起应该自动追加这些字段。写成这样就可以了:

protected $appends = ['full_name'];
로그인 후 복사

为不存在列增加一个变异器(属性设置器)

变异器与获取器相反。你可以用它做些很有意思的事情。 举个例子,转换不同类型的输入。 让我来给你详细说说。假设你想要保存一种类型的时间段。通常,你总是保存尽可能小的单位。在我们的案例中是秒。由于UX的原因,用户不想输入秒,例如在一个地方输入分钟,或者在另一个地方输入小时。这一切都可以很快解决。

class Video extends Model
{
    public function setDurationInMinutes($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60;
    }

    public function setDurationInHours($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60 * 60;
    }
}
로그인 후 복사

上述代码意味着你可以使用一个不存在于数据表本身的字段。
model中使用的是duration_in_minutes字段,但是在后台,我们使用duration_in_seconds进行更新,也有可能使用一个不存在字段duration_in_hours。根据这个逻辑,我们在Controller如此调用:

class AnyController
{
    public function store()
    {
        $video->update([
            'title' => request('title'),
            'duration_in_minutes' => request('duration_in_minutes'),
        ]);
    }
}
로그인 후 복사

这将节省你在控制器中进行计算的时间,你可以简单地使用不存在的列,并在执行某些计算时使用变异器

$comments = Comment::all();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
로그인 후 복사

이제 다음과 같이 post 모델의 full_name 속성에 액세스할 수 있습니다.

$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
로그인 후 복사
로그인 후 복사

객체(컬렉션 등)가 반환되는 경우 이 속성은 사용자 모델에 연결되지 않습니다. 모델에 protected$appends 속성을 ​​추가하세요. 이제부터 자동으로 추가되어야 하는 하나 이상의 필드를 포함하는 배열을 허용합니다. 다음과 같이 작성하세요.

SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
로그인 후 복사
로그인 후 복사

존재하지 않는 열에 대한 mutator(속성 설정자) 추가

Mutator는 getter의 반대입니다. 당신은 그것으로 정말 흥미로운 일을 할 수 있습니다. 예를 들어 다양한 유형의 입력을 변환합니다. 자세히 말씀드리겠습니다. 특정 기간 유형을 저장한다고 가정해 보겠습니다. 일반적으로 항상 가능한 가장 작은 단위를 저장합니다. 우리의 경우에는 초입니다. UX상의 이유로 사용자는 한 곳에서는 분, 다른 곳에서는 시간과 같은 초를 입력하고 싶어하지 않습니다. 이 모든 것은 빠르게 해결될 수 있습니다.

protected $with = [];
로그인 후 복사
로그인 후 복사

위 코드는 데이터 테이블 자체에 존재하지 않는 필드를 사용할 수 있다는 의미입니다.
모델에서는 duration_in_seconds 필드가 사용되지만 백그라운드에서는 duration_in_seconds를 사용하여 업데이트하거나 존재하지 않는 필드를 사용할 수도 있습니다. < 코드>duration_in_hours. 이 논리에 따르면 컨트롤러에서 이를 다음과 같이 호출합니다.

User::all()->pluck(&#39;id&#39;);
로그인 후 복사
로그인 후 복사

이렇게 하면 컨트롤러에서 계산을 수행하는 시간이 절약됩니다. 간단히 존재하지 않는 열을 사용하고 특정 계산을 수행할 때 mutator<를 사용할 수 있습니다. /code> 결과를 올바른 필드에 매핑합니다. 🎜🎜Eager loading: with $with🎜🎜관계에 대해 이야기해 봅시다. 기본적으로 Laravel은 지연 로딩을 사용합니다. 관계 측면에서 이것은 무엇을 의미합니까? 지연 로딩의 장점은 모든 데이터를 유지할 필요가 없고 필요할 때 데이터를 로드할 수 있기 때문에 메모리를 절약할 수 있다는 것입니다. 다음과 같습니다: 🎜<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;">User::all()-&gt;pluck(&amp;#39;id&amp;#39;)-&gt;toArray();</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜위의 예에서는 모든 댓글 데이터를 가져옵니다. 그런 다음 주석을 반복하고 각 주석의 사용자 이름을 표시합니다. 이 코드에는 아무런 문제가 없으며 잘 작동하지만 문제가 발생했습니다. 이제 지연 로딩을 통해 사용자 이름을 출력하려는 ​​경우에만 사용자를 가져오는 쿼리가 실행됩니다. 🎜🎜첫 번째 N+1 질문에 오신 것을 환영합니다. 왜 N+1인가? N은 항상 리뷰 수이고 1은 리뷰를 가져오는 쿼리입니다. 예를 들어 리뷰가 500개 있는 경우 모든 리뷰를 가져오는 쿼리가 한 번 트리거된 다음 리뷰당 해당 사용자를 가져오는 쿼리가 하나 실행됩니다. 따라서 500+1 쿼리입니다. 즉, 주석 수가 증가하면 쿼리 수도 늘어납니다. 🎜🎜이를 방지하기 위해 Eager Loading이라는 방법이 있습니다. 🎜<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;">$comments = Comment::with(&amp;#39;user&amp;#39;)-&gt;get(); foreach ($comments as $comment) { echo $comment-&gt;user-&gt;name; }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><p>这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):</p><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;">SELECT id, user_id, body FROM comments; SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><p>不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。</p><p>好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。</p><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;">protected $with = [];</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><p>我们可以在<code>Comment model简单设置 protected $with = [&#39;user&#39;];, 从现在起,user在任何时候都会自动加载。

我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。

modelKeys 方法

有的时候需要查询所有的主键 ID, 查询是否复杂并不重要,大多数人可能会像这样做:

User::all()->pluck(&#39;id&#39;);
로그인 후 복사
로그인 후 복사

这个操作很 nice,但是返回的是一个集合,想要转换成数组的话可以使用 toArray()

User::all()->pluck(&#39;id&#39;)->toArray();
로그인 후 복사
로그인 후 복사

大多数情况下,上面的操作的可以简化成这样:

User::all()->modelKeys();
로그인 후 복사

这种方式返回一个数组。重要的是这个方法并不会总是返回 id。 顾名思义,他是以数组的形式返回所有模型主键。主键默认是id,同时也可以在模型中定义主键名。

protected $primaryKey = &#39;id&#39;;
로그인 후 복사

原文地址:https://laravel-news.com/6-eloquent-secrets

译文地址:https://www.php.cn/link/c7decb5ce28209911b545d0b1059c5e3

【相关推荐:laravel视频教程

위 내용은 코드 가독성을 향상시키는 데 도움이 되는 6가지 Laravel Eloquent 팁!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿