Laavel Eloquent에서 VIEW 레이크의 모형을 제작합니다.

7681 단어 PHPLaravel

개요


제목의 VIEW는 SQL의 VIEW입니다(이하 대문자로 표시할 때 SQL의 VIEW).
데이터베이스에서 VIEW를 만들고 싶지는 않지만, 모델로서 VIEW 같은 걸 쓰고 싶어 도전해봤어요.

컨디션


PHP 7.0.14
Laravel 5.4.0

디테일


시나리오


데이터베이스에는 사용자 테이블과 연결된 테이블이 있으며, 이 테이블에 기록이 있는지 여부에 따라 사용자의 상태를 정의하려고 합니다.
예) 프로모션에 참여한 이용자라면'이미 프로모션에 참가했다'는 상태로, 한 번이 없으면'이미 가입했다'는 상태로 표현해야 한다.
캠페인은 캠페인 테이블입니다. 홍보활동에 응모하면usercampaign 책상 위에서userid와campaig-한 쌍의 id를 저장한다고 가정하십시오.
사실 아직 많은 상태가 있지만 샘플은 두 개입니다.그래도 컨디션이 늘더라도 쉽게 대처할 수 있어야 한다.

샘플 코드


추상적 기초반을 세우다


나는 VIEW처럼 읽기 전용으로 만들고 싶다.$fillable 빈 배열로 정의, __set 마술 방법을 사용하면 문답이 필요 없고 예외를 던질 수 있다.
Models/View.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

abstract class View extends Model
{
    protected $fillable = [];

    final public function __set($key, $value)
    {
        throw new \RuntimeException('this class is just readable.');
    }
}
속성은 사용할 수 없습니다final. 따라서 $fillable는 하위 클래스에 덮어씌울 수 있습니다. 하지만 어쩔 수 없습니다.
추기 2017-2416:10
@mikkame 귀하의 의견을 받아 수정했습니다.fill 방법은 내부에서 호칭setAttribute되기 때문에 __set도 무효화하면 덮어쓰여도 상관없다(tinker 예외가 확인됨).
    final public function setAttribute($key, $value)
    {
        throw new \RuntimeException('this class is just readable.');
    }
추기는 여기까지다

실현 클래스


Models/UserState.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;

class UserState extends View
{
    protected $table = 'users';

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('core', function (Builder $builder) {
            $builder->select(['users.id'])
                ->selectRaw('CASE WHEN user_campaign.id IS NOT NULL THEN 1 ELSE 0 END AS campaign_applied')
                ->leftJoin('user_campaign', 'user_campaign.user_id', 'users.id')
            ;
        });
    }

    public function getValueAttribute()
    {
        if ($this->campaign_applied) {
            return 'キャンペーン応募済み';
        }
        return 'ユーザー登録済み';
    }
}
일반 질의를 포함하도록 전역 역할 영역을 등록합니다.

집합근류


User 클래스와 관계를 맺습니다.
    public function state()
    {
        return $this->hasOne(UserState::class, 'id', 'id');
    }
이렇게 하면 아래와 같이 호출할 수 있다.

$users = User::with('state')->get();
foreach ($users as $user) {
    echo $user->state->value;
}

뭐가 그리 좋으냐

  • 표로 표시되지 않은 데이터를 Eloquent 모델로 표시할 수 있음(작용역 조회, 액세스기/정음기 사용 가능)
  • VIEW를 제작할 필요가 없다(제작이 필요하면 당연히 제작할 수 있고, 이를 바탕으로 View 등급을 계승한 모형류를 제작할 수 있다. 시도해 본 적은 없지만)
  • Eager Loading
  • 사용 가능
  • 총근류는 증가하지 않는다
  • 나는 줄곧 생각했는데, 아직 장점보다 더 좋은 결점을 발견하지 못했다.
    이러면 큰일 아닙니까?아니면, 그러면 그거 하면 안 돼?이런거, 구멍 같은 게 있으면 지적이 됐으면 좋겠어
    잠시 사용해 보세요. 만약 구상하지 않은 문제, 부차적인 장점 등을 발견하면 언제든지 여기에 보충하세요.

    좋은 웹페이지 즐겨찾기