Laavel Eloquent에서 VIEW 레이크의 모형을 제작합니다.
개요
제목의 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;
}
뭐가 그리 좋으냐
이러면 큰일 아닙니까?아니면, 그러면 그거 하면 안 돼?이런거, 구멍 같은 게 있으면 지적이 됐으면 좋겠어
잠시 사용해 보세요. 만약 구상하지 않은 문제, 부차적인 장점 등을 발견하면 언제든지 여기에 보충하세요.
Reference
이 문제에 관하여(Laavel Eloquent에서 VIEW 레이크의 모형을 제작합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nunulk/items/54c2f34b0e4d4069c76c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)