ã¯ããã«
Laravelã¯æ¡ä»¶ã®âŒéšã§äœ¿âœ€ããããLaravelæ¡ä»¶ã«å°ãåç»ããçšåºŠã®ååŠè
ã§ãã
åºæ¬çã«ã¯QueryBuilderã䜿✀ããŠããŸããããEloquentãšã©ã¡ããè¯ãããšâŸããããšâŒâ»âŒçã§ãããšæããŸãã
EloquentORM VS QueryBuilderãªããŠâŒ€æŠã«åå ããã®ãæãã§ããããã
ãã ãEloquentãé¢é£ããLaravelã®æ©èœã¯ããªãã®æ°ããããããEloquentã§âŒæ°é貫ãããã®ãè¯ãã®ããªãšæã£ãŠããŸããN+1åé¡ãwithã§âŒå¿è§£æ±ºã¯ã§ãããšæããŸãã
ãŸãã¢ãã«ã«join䜿ãã®ã ãã¯äžâŸãããããããŠã¢ã¯ãã£ãã¬ã³ãŒããã亡ããªãã«ãªã£ãŠãã®ã§ãååŒãšã¯æã£ãŠããŸãã
ããã©ãŒãã³ã¹âŸ¯ãåŠç¿ã³ã¹ããåâ»æ§ãªã©æ§ã
ãªâŸ¯ã§è¯ãæªããããäž¡è
ã§ãããä»åã¯ã©ããEloquetORMã䜿✀ãããªãããšããããšã§äžèš4ã€ã®æ©èœã䟿å©ã ã£ãã®ã§ãâŸåããããã䜿ã£ãŠãããããšããæ°æã¡ã蟌ãã玹ä»ã§ãïŒ
Eloquentæè¿å¥œãã§ãã
ç°å¢
- ããŒãžã§ã³
- Laravel 10
- OS
- Windows
ãã£ã¹ã
屿§ã«ã¢ã¯ã»ã¹ããéã«ãå®çŸ©ãããã£ã¹ãã«å€æããŠããããã®ã§ãã
ã¢ãã«ãã¿ããšãã«åŠçã§ã¯ã©ã®ãããªåã§å¿
èŠãšããŠããã®ãç¥ããããã¢ã¯ã»ã¹ãããæ³å®ãšéã£ãããªããŠããšã¯é²ããŸãã
class User extends Model
{
/**
*
* @var array
*/
protected $casts = [
'is_flg' => 'boolean',
'open_date => 'datetime',
'close_date => 'datetime',
];
}
ã¢ã¯ã»ãµ
æå®ãã屿§ã«ã¢ã¯ã»ã¹ããããšãã«ãå€ãå€åœ¢ããŠååŸã§ããŸãã
å€ã®æå®ã¯ã¢ã¯ã»ãµåãã¢ã¯ã»ã¹ãã屿§ã«ããŸãã
ã¹ããŒã¯ã±ãŒã¹ã®å±æ§ã¯ãã£ã¡ã«ã±ãŒã¹ã§æå®ããŸãã
äžèšã®äŸã§ã¯ãnameã«ã¢ã¯ã»ã¹ããŠååŸããéã«Helloãšããâœååãé£çµãããŠååŸããŠããŸãã
ãã®ãŸãŸã®ãŠãŒã¹ã±ãŒã¹ããã®ãŸãŸã³ãŒãã«èœãšã蟌ããšãã€ãã¡ãœãããäœæããŠããŸããã¡ã§ãããã¢ã¯ã»ãµã䜿✀ããããšã§ãæ¯åºŠå€ãå€åœ¢ãããåŠçãèšèŒããå¿
èŠããªããªããŸããã¢ããŒé¢æ°ã§ãªããŠãåäœããŸãã
ã³ãŒã
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
protected function name(): Attribute
{
return Attribute::make(
get: fn ($attributes) => $attributes . 'Hello!'
);
}
}
åäœç¢ºèª
> $user = new App\Models\User();
= App\Models\User {#3788}
> $user -> name = 'ãã¹ã';
= "ãã¹ã"
> $user -> name
= "ãã¹ãHello!"
屿§ã«ã¢ã¯ã»ã¹ããéã«ãäžèšã®ããã«getAttributes()ã䜿ãããšã§ãã¢ã¯ã»ãµãç¡å¹åã§ããŸãã
$user -> getAttributes()['name']
ãã¥ãŒããŒã¿
æå®ãã屿§ãèšå®ããéã«ãã®å€ãå€åœ¢ãããŸãã
å
ã»ã©ã®ã¢ã¯ã»ãµãšã¯éã®ãã®ã§ãã
äžèšã§ã¯ãnameãèšå®ããéã«ãããããšããâœååãé£çµãããŠããŸãã
ãã¡ããã¢ã¯ã»ãµåæ§ã«èšå®æ¯ã«å€ãå€åœ¢ãããåŠçèšèŒã®âŒ¿éãçããŸãã
ãã¡ããã¢ããŒé¢æ°ã§ãªããŠãåäœããŸãã
ãœãŒã¹
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
protected function name(): Attribute
{
return Attribute::make(
set: fn (string $attributes) => $attributes . 'ãã'
);
}
{
åäœç¢ºèª
> $user -> name = 'ãã¹ã'; = "ãã¹ã" > $user -> name = "ãã¹ããã"
ãã¥ãŒããŒã¿ã«é¢ããŠã¯æšå¥šããããããªç¡å¹å⌿段ã¯âœ€æãããŠãããã«ãªãã§ãã
ãã®ããããã¥ãŒããŒã¿ã«é¢ããŠã¯åâŒéçºã§ã¯ãªãå Žåãæ
éã«æ±ãå¿
èŠãããããã§ãã
ã¢ã¯ã»ããµ&ãã¥ãŒããŒã¿æ··å
次ã¯äž¡è
ãã²ãšãŸãšãã«ããŠèšèŒããâœ
æ³ã§ãã
åäœã®ã¢ã¯ã»ãµãšãã¥ãŒããŒã¿ã«ãéãããšããã§ããã
ãuse Illuminate\Database\Eloquent\Casts\Attribute; ããå¿ãããšãåäœããŸããã
äžèšã®ã³ãŒãã¯å
ã»ã©ã®ã¢ã¯ã»ãµãšãã¥ãŒããŒã¿ãã²ãšãŸãšãã«èšèŒãã
nameãèšå®ãããããããããé£çµããnameãžã¢ã¯ã»ã¹ããŠååŸãããšãHello!ããé£çµãããŠè¿ã£ãŠããŸãã
ããªãâŸã✬ãã¹ãããªããŸããã
ã³ãŒã
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
public function name(): Attribute
{
return new Attribute(
// ã¢ã¯ã»ããµ
get: fn ($attribute) => $attribute . 'Hello!',
// ãã¥ãŒããŒã¿
set: fn ($attribute) => $attribute . 'ãã',
);
}
}
åäœç¢ºèª
> $user = new App\Models\User();
= App\Models\User {#3788}
> $user -> name = 'ãã¹ã';
= "ãã¹ã"
> $user -> name
= "ãã¹ãããHello!"
ã¹ã³ãŒã
Laravelã§âŸãã¹ã³ãŒããšã¯whereå¥ã®ãããªãã®ã§ãã
å
šç¶order_byã䜿ããã®ã§ååããã§ãã
äž»ã«æŽ»èºããã®ã¯ã⌀ççºãã¡ãããã¡æ€çŽ¢ã¯ãšãªã ãšæããŸãã
ã¹ã³ãŒãã«ã¯äžèšã®2çš®é¡ããããŸãã
- ã°ããŒãã«ã¹ã³ãŒã
- ããŒã«ã«ã¹ã³ãŒã
ã°ããŒãã«ã¹ã³ãŒã
ã°ããŒãã«ã¹ã³ãŒãã¯èšå®ããã¢ãã«ãžã®å
šãŠã®ã¯ãšãªã«å¯ŸããŠãé©âœ€ãããæ¡ä»¶ã§ãã
äžèšã®ã³ãŒãã¯ãŸããScopesãã£ã¬ã¯ããªé
äžã«TestScopeãšãããã¡ã€ã«ãäœæããŠããŸãã
php artisan make:scope TestScope
ãã®äžScopeã¯ãis_public = 1ããšããŠãå ¬éæžã¿ã®èšäºã®ã¿ãååŸããwhereå¥ãæå®ããŠããŸãã
ã³ãŒã
namespace App\Models\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class TestScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('is_public', '=', 1);
}
}
ãã®TestScopeãArticleã¢ãã«ãžé©âœ€ãããããšã§ãArticleã¢ãã«ãžã®å
šãŠã®ã¯ãšãªã«Scopeã§å®çŸ©ããæ¡ä»¶ãé©âœ€ãããããšãã§ããŸãã
bootedã¡ãœããã®ãªãŒããŒã©ã€ããšaddGlobalScopeã¡ãœããã®æå®ãå¿
èŠã§ãaddGlobalScopeã¡ãœããã¯ã¹ã³ãŒãã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãåŒæ°ãšããŸãã
use App\Models\Scopes\TestScope;
class Article extends Model
{
protected static function booted()
{
static::addGlobalScope(new TestScope);
}
{
äžèšã®èšè¿°ã§ã°ããŒãã«ã¹ã³ãŒãã®è§£é€ãå®çŸã§ããŸãã
Article::withoutGlobalScope(TestScope::class)->get();
ããŒã«ã«ã¹ã³ãŒã
ããŒã«ã«ã¹ã³ãŒãã¯ã°ããŒãã«ã¹ã³ãŒããšéã£ãŠãå
šãŠã®ã¯ãšãªã«é©âœ€ããããã®ã§ã¯ãªããå¿
èŠæ§ããããšãã®ã¿ã䜿✀ããããšãã§ããŸãã
åºæ¬çã«ã¯ãã¡ãã®âœ
ãå€ã䜿ãããªãšåâŒçã«ã¯æããŠãŸãã
ãŸããã¢ãã«ã«scopeãäœæããŸãã
ãã®ãšããã¢ãã«ã¡ãœããã®æåã«ãscopeããšä»ããŠãã ãã
class User extends Model
{
// 20代ã®ãŠãŒã¶ãŒãååŸãã
public function scopeTwenties(Builder $query)
{
$query->whereBetween('age', [20, 29]);
}
// æ§å¥ã1ã®ãŠãŒã¶ãŒãååŸãã
public function scopeMale(Builder $query)
{
$query->where('gender', '=', 1);
}
{
åŒã³åºããšãã¯äžèšã®ããã«ã¹ã³ãŒãå®çŸ©ã§ä»ããå
é ã®ãscopeãã¯å€ããŸãã
ããã§ãåãã¯ãšãªãæžã⌿éãçããServiceãã¡ã€ã«ãžã®èšèŒãªã©ãæžããŸãã
$users = User::twenties()->get(); $users = User::male()->get();
ããã«ããã®ããŒã«ã«ã¹ã³ãŒãã®è¯ããšããã¯ãã§ãŒã³ããããšãã§ããŸãã
ãã®ãããåâŒçã«ã¯ããªã⌀ããã®æ€çŽ¢ã®ãŠãŒã¹ã±ãŒã¹ã®éã«ã¯ããã€ãã«åãåããŠããã§ãŒã³ããŠãããããšã§ãã¡ãœããã®è¥âŒ€åãå¯èªæ§ã®äœäžã察çã§ããããªãšæããŸãã
// 20ä»£ã§æ§å¥ã1ã®ãŠãŒã¶ãŒãååŸãã $users = User::twenties()->male()->get();
ãããã«
Eloquentã®æ©èœã¯æžã✠ã«ãããªãã®ãã£ã¡ããšããã¿ã€ããã³ããªã©ã®ç§©åºãäžããŠãããŠããã®ã§ãããã¯ãããããã€ã³ãã§ãã
âŸåçã«ã¯ããªãEloquentã®äŸ¿å©ãã«æè¿ããã£ãŠããã®ã§ãããããããã¿ããšãã«æ°ã¥ããâŒãå€ããšæããŸããã»ãšãã©ãModelãžã®èšèŒã«ãªã£ãŠããŸãã
MVCã¢ãã«ãšâŸãããLaravelã¯FatControlleråé¡ã«ãã£ãŠãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠUseCaseã«åããããServiceã«åãããïŒããã®åãåã✠ã®è³åŠäž¡è«ã¯çœ®ããšããŠïŒããŠããŸãã
æžããšããŠå
ã⌊ããªãããšãâŸããšEloquentã®æ©èœã«ãã£ãŠããã®åŠçã¯ç¢ºãã«ã¹ããŒãã«ãªããŸãã
ããçµå±ã¯FatModelåé¡ã«ãªã£ãŠããæ°ãããªãã¯ãããŸããã
責åãåãããšããç¹ã§ã¯ããããã§ãããïŒ
ãããžã§ã¯ãã®èŠæš¡ã«ããããšã¯æããŸããããããããããã£ãŠããªãã®ã§å匷ããŠããããã§ãã