PHP Laravel颿¥è³ªå 2026幎çïŒEloquentããã¥ãŒãã¢ãŒããã¯ãã£ãã¿ãŒã³å®å šè§£èª¬
2026幎ã®Laravelæè¡é¢æ¥ã§é »åºããEloquent ORMããã¥ãŒèšèšããµãŒãã¹ã³ã³ããã«é¢ãã質åãšåçäŸã詳ãã解説ãN+1åé¡å¯Ÿçãããžã§ããããã³ã°ãDIãã¿ãŒã³ãŸã§ç¶²çŸ ã

PHP Laravelãã¬ãŒã ã¯ãŒã¯ã®é¢æ¥è³ªåã¯ãåãªãæ§æç¥è以äžã®ãã®ãæ±ããã2026å¹Žã«æ¡çšãè¡ãäŒæ¥ã¯ãEloquentã®ãªã¬ãŒã·ã§ã³æé©åããã¥ãŒé害åŠçããµãŒãã¹ã³ã³ããã®ãã€ã³ãã£ã³ã°ã«ã€ããŠãæ¬çªç°å¢ã¬ãã«ã®è©³çްãªèª¬æãæåŸ ããŠãããLaravel 13ã§ã¯AIããŒã«ãJSON:APIãªãœãŒã¹ããã¯ãã«æ€çŽ¢æ©èœãå°å ¥ãããæè¡é¢æ¥ã«æ°ããªæ¬¡å ãå ãã£ãã
ã·ãã¢Laravelããžã·ã§ã³ã§ã¯3ã€ã®é åã«çŠç¹ãåœãŠãããïŒEloquentããã©ãŒãã³ã¹ïŒN+1鲿¢ããã£ã³ãã³ã°ãã«ãŒãœã«ããŒãžããŒã·ã§ã³ïŒããã¥ãŒã®ä¿¡é Œæ§ïŒãªãã©ã€ããããã¬ã¿ãŒåŠçããžã§ããããã³ã°ïŒããããŠã¢ãŒããã¯ãã£æ±ºå®ïŒãµãŒãã¹ãããã€ãããã¡ãµãŒã vs ã€ã³ãžã§ã¯ã·ã§ã³ããªããžããªãã¿ãŒã³ïŒã
Eloquent ORMïŒãªã¬ãŒã·ã§ã³èªã¿èŸŒã¿ãšã¯ãšãªæé©å
Eloquentã®é¢æ¥è³ªåã§ã¯ãN+1åé¡ãäžè²«ããŠåãäžãããããåè£è
ã¯with()ãload()ãloadMissing()ããã€äœ¿çšãããããŸãå€§èŠæš¡ããŒã¿ã»ããã®ã€ãŒã¬ãŒããŒãã«ãããã¡ã¢ãªã®ãã¬ãŒããªãã説æã§ããªããã°ãªããªãã
// äžèŠãªããŒã¿ã®èªã¿èŸŒã¿ãé¿ãããããå¶çŽä»ãã§ã€ãŒã¬ãŒããŒã
$users = User::query()
->with(['posts' => function (Builder $query) {
$query->where('published', true)
->select('id', 'user_id', 'title', 'published_at');
}])
->withCount('posts')
->paginate(25);
// æªãäŸïŒã«ãŒãå
ã§postsã«ã¢ã¯ã»ã¹ãããšN+1ãçºç
foreach ($users as $user) {
$user->posts; // åã€ãã¬ãŒã·ã§ã³ã§ããŒã¿ããŒã¹ã«ã¯ãšãªãçºè¡ããã
}withCount()ã¡ãœããã¯ãé¢é£ã¬ã³ãŒããããŒãããã«ã«ãŠã³ããããµãã¯ãšãªã远å ãããããã«ãããäžèЧããŒãžã§ã«ãŠã³ãã衚瀺ããéã®ã¡ã¢ãªãªãŒããŒããããåé¿ã§ãããã¢ã¯ã»ã¹ãããªãå¯èœæ§ã®ãããªã¬ãŒã·ã§ã³ã«ã¯ãloadMissing()ã䜿çšããããšã§ãäžæµã§ãã§ã«ã€ãŒã¬ãŒããŒããããŠããå Žåã®åé·ãªã¯ãšãªã鲿¢ã§ããã
ãããããã©ããŒã¢ãã質åãšããŠãã«ãŒãœã«ããŒãžããŒã·ã§ã³ãšãªãã»ããããŒãžããŒã·ã§ã³ã®éããæãããããã«ãŒãœã«ããŒãžããŒã·ã§ã³ã¯cursorPaginate()ã䜿çšããå€§èŠæš¡ããŒãã«ã§ãªãã»ããããŒãžããŒã·ã§ã³ãçŽé¢ããããã©ãŒãã³ã¹ã®æ¥æ¿ãªäœäžãåé¿ããããã¬ãŒããªããšããŠãã«ãŒãœã«ããŒãžããŒã·ã§ã³ã§ã¯ä»»æã®ããŒãžãžã®ãžã£ã³ããã§ããªãã
é«åºŠãªEloquentïŒããªã¢ãŒãã£ãã¯ãªã¬ãŒã·ã§ã³ãšã¯ãšãªã¹ã³ãŒã
ããªã¢ãŒãã£ãã¯ãªã¬ãŒã·ã§ã³ã§ã¯ãmorphããããšã€ã³ããã¯ã¹æŠç¥ã«ã€ããŠæ£ç¢ºãªçè§£ãæ±ããããã颿¥å®ã¯ãæçš¿ãåç»ã補åã«å±ããã³ã¡ã³ãã®ã·ããªãªãæç€ºããåè£è ã«ã¯ãšãªã®æé©åãæ±ããããšãå€ãã
class Comment extends Model
{
// morphToã¯commentable_typeåãã芪ã¿ã€ããèªåçã«è§£æ±º
public function commentable(): MorphTo
{
return $this->morphTo();
}
}
// AppServiceProvider.php
// morphãããã¯ããŒã¿ããŒã¹ãžã®ã¯ã©ã¹åé²åºãé²ããã¯ãšãªããã©ãŒãã³ã¹ãåäž
Relation::enforceMorphMap([
'post' => Post::class,
'video' => Video::class,
'product' => Product::class,
]);morphãããã«ã¯2ã€ã®ç®çãããïŒããŒã¿ããŒã¹å€ãã¯ã©ã¹åããåé¢ãïŒãã€ã°ã¬ãŒã·ã§ã³ãªãã§ãªãã¡ã¯ã¿ãªã³ã°ãå¯èœã«ããïŒãããçãã€ã³ããã¯ã¹å¯èœãªæååãäœæãããmorphãããããªããã°ãLaravelã¯App\Models\Postã®ãããªå®å
šãªã¯ã©ã¹åãcommentable_typeåã«æ ŒçŽããã
ã¯ãšãªã¹ã³ãŒãã¯ãåå©çšå¯èœãªã¯ãšãªããžãã¯ã®çè§£ã瀺ããã°ããŒãã«ã¹ã³ãŒãã¯èªåçã«é©çšãããããŒã«ã«ã¹ã³ãŒãã¯æç€ºçãªåŒã³åºããå¿ èŠã§ãããå žåçãªé¢æ¥è³ªåã§ã¯ãããããããã€äœ¿çšããããåãããã
// ã°ããŒãã«ã¹ã³ãŒãïŒæç€ºçã«é€å»ããªãéããã¹ãŠã®ã¯ãšãªã«é©çš
protected static function booted(): void
{
static::addGlobalScope('published', function (Builder $builder) {
$builder->where('published', true);
});
}
// ããŒã«ã«ã¹ã³ãŒãïŒ->popular()ã§æç€ºçã«åŒã³åºã
public function scopePopular(Builder $query, int $minViews = 1000): Builder
{
return $query->where('views', '>=', $minViews);
}
// 䜿çšäŸïŒPost::popular(5000)->get()
// ã°ããŒãã«ã¹ã³ãŒãã®é€å»ïŒPost::withoutGlobalScope('published')->get()ãã¥ãŒã¢ãŒããã¯ãã£ïŒãžã§ãèšèšãšé害åŠç
ãã¥ãŒã«é¢ãã質åã§ã¯ãæ¬çªç°å¢å¯Ÿå¿åãè©äŸ¡ããããLaravel 13.31ã§ã¯ãæ¥ç¶äžã®ãã¹ãŠã®ãžã§ããã«ãŠã³ãããQueue::totalSize()ãšãã°ã¬ãŒã¹ãã«ã·ã£ããããŠã³åŠççšã®JobInterruptedã€ãã³ãã远å ããããåè£è
ã¯ãsyncãdatabaseãRedisãSQSãã©ã€ãã®éããšããããããé©åããå Žé¢ãçè§£ããŠããå¿
èŠãããã
Laravelãã¥ãŒãã¿ãŒã³ã®ãã詳现ãªå 容ã«ã€ããŠã¯ããã¥ãŒïŒãžã§ã颿¥è³ªåã¢ãžã¥ãŒã«ãåç §ããããã
class ProcessOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public int $tries = 3; // 倱æåã®æå€§è©Šè¡åæ°
public int $backoff = 60; // ãªãã©ã€éã®ç§æ°
public int $timeout = 120; // æå€§å®è¡æé
public int $maxExceptions = 2; // 2åã®æªåŠçäŸå€ã§å€±æ
public function __construct(
public readonly Order $order
) {}
public function handle(PaymentGateway $gateway): void
{
// SerializesModelsã¯ãžã§ãå®è¡æã«OrderãããŒã¿ããŒã¹ãããªãã¬ãã·ã¥
$gateway->charge($this->order);
}
public function failed(Throwable $exception): void
{
// ãã¹ãŠã®ãªãã©ã€å€±æåŸã«åŒã³åºããã - ããŒã ãžã®éç¥ãè¿éãªã©
Log::critical('Order processing failed', [
'order_id' => $this->order->id,
'exception' => $exception->getMessage(),
]);
}
}SerializesModelsãã¬ã€ãã¯ãå®å
šãªã¢ãã«ã§ã¯ãªãã¢ãã«IDã®ã¿ããã¥ãŒãã€ããŒãã«æ ŒçŽããããžã§ãå®è¡æã«ãEloquentã¯æ°ããã€ã³ã¹ã¿ã³ã¹ããã§ãããããããã«ããå€ãããŒã¿ã鲿¢ã§ããããåé€ãããã¢ãã«ã¯ModelNotFoundExceptionãåŒãèµ·ãããããã¯deleteWhenMissingModelsã§åŠçããã
ãžã§ããããã³ã°ã«é¢ãã質åãé »ç¹ã«åºçŸããããããã¯ãžã§ããã°ã«ãŒãåããå®äºã倱æããã£ã³ã»ã«æã®ã³ãŒã«ããã¯ãå®çŸ©ã§ããã
public function processBatch(array $orderIds): PendingBatch
{
$jobs = collect($orderIds)
->map(fn (int $id) => new ProcessOrder(Order::find($id)));
return Bus::batch($jobs)
->name('Process Orders ' . now()->toDateString())
->allowFailures() // äžéšã®ãžã§ãã倱æããŠãããããç¶ç¶
->then(function (Batch $batch) {
// ãã¹ãŠã®ãžã§ããæ£åžžã«å®äº
Notification::send(Admin::all(), new BatchCompleted($batch));
})
->catch(function (Batch $batch, Throwable $e) {
// ãããå
ã®æåã®å€±æ
Log::warning('Batch job failed', ['batch_id' => $batch->id]);
})
->finally(function (Batch $batch) {
// ãããçµäºïŒæåãŸãã¯å€±æïŒ
})
->dispatch();
}Laravelã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
ãµãŒãã¹ã³ã³ããïŒãã€ã³ãã£ã³ã°ãã³ã³ããã¹ãã€ã³ãžã§ã¯ã·ã§ã³ããããã€ã
ãµãŒãã¹ã³ã³ããã¯Laravelã®äžæ žã§ããã颿¥è³ªåã§ã¯ããã€ã³ãã£ã³ã°ã¿ã€ãã解決é åºãåã¢ãããŒãããã€äœ¿çšãããã«ã€ããŠã®çè§£ããã¹ããããã
public function register(): void
{
// ã·ã³ã°ã«ãã³ïŒãªã¯ãšã¹ãã©ã€ããµã€ã¯ã«å
šäœã§åãã€ã³ã¹ã¿ã³ã¹
$this->app->singleton(PaymentGateway::class, function (Application $app) {
return new StripeGateway(
apiKey: config('services.stripe.secret'),
logger: $app->make(LoggerInterface::class)
);
});
// ãã€ã³ãïŒè§£æ±ºããšã«æ°ããã€ã³ã¹ã¿ã³ã¹
$this->app->bind(ReportGenerator::class, function (Application $app) {
return new PdfReportGenerator($app->make(ViewFactory::class));
});
// ã³ã³ããã¹ããã€ã³ãã£ã³ã°ïŒã³ã³ã·ã¥ãŒãããšã«ç°ãªãå®è£
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(fn () => Storage::disk('photos'));
$this->app->when(DocumentController::class)
->needs(Filesystem::class)
->give(fn () => Storage::disk('documents'));
}ã³ã³ããã¹ããã€ã³ãã£ã³ã°ã¯ãå¥ã
ã®ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããã«ãç°ãªãã¯ã©ã¹ã«ç°ãªãå®è£
ãã€ã³ãžã§ã¯ãããåé¡ã解決ãããã³ã³ããã¯ãã©ã®ã¯ã©ã¹ããªã¯ãšã¹ãããŠãããã«åºã¥ããŠFilesystemãç°ãªãæ¹æ³ã§è§£æ±ºããã
ã·ãã¢ã¬ãã«ã®è³ªåã§ã¯ãé å»¶ãããã€ãã«ã€ããŠåããããæšæºã®ãµãŒãã¹ãããã€ãã¯ããã®ãµãŒãã¹ã䜿çšãããªããŠããã¹ãŠã®ãªã¯ãšã¹ãã§ç»é²ããããé å»¶ãããã€ãã¯ã宣èšããããµãŒãã¹ã®1ã€ã解決ããããšãã«ã®ã¿ç»é²ãããã
class ReportingServiceProvider extends ServiceProvider implements DeferrableProvider
{
public function register(): void
{
$this->app->singleton(ReportingService::class, function () {
return new ReportingService(/* éãåæå */);
});
}
// ReportingServiceããªã¯ãšã¹ãããããšãã®ã¿ã³ã³ããããã®ãããã€ããããŒã
public function provides(): array
{
return [ReportingService::class];
}
}ããã«ãŠã§ã¢ïŒãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ãããŒãšã¿ãŒãããã«ããã«ãŠã§ã¢
ããã«ãŠã§ã¢ã®è³ªåã§ã¯ããªã¯ãšã¹ãã©ã€ããµã€ã¯ã«ã®ç解床ã確èªãããããã«ãŠã§ã¢ã¯ã³ã³ãããŒã©ã®ååŸã®äž¡æ¹ã§ã³ãŒããå®è¡ã§ããã¿ãŒãããã«ããã«ãŠã§ã¢ã¯ã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããåŸã«å®è¡ãããã
class LogRequestMetrics
{
public function handle(Request $request, Closure $next): Response
{
$request->attributes->set('start_time', microtime(true));
// 次ã®ããã«ãŠã§ã¢/ã³ã³ãããŒã©ã«é²ã
return $next($request);
}
// ã¿ãŒãããã«ïŒã¬ã¹ãã³ã¹éä¿¡åŸã«å®è¡
public function terminate(Request $request, Response $response): void
{
$duration = microtime(true) - $request->attributes->get('start_time');
Log::info('Request completed', [
'path' => $request->path(),
'status' => $response->getStatusCode(),
'duration_ms' => round($duration * 1000, 2),
]);
}
}ã¿ãŒãããã«ããã«ãŠã§ã¢ã¯ãåæããã®ã³ã°ãã¯ãªãŒã³ã¢ãããªã©ãã¬ã¹ãã³ã¹æéã«åœ±é¿ãäžããã¹ãã§ãªãæäœã«æçšã§ãããterminateã¡ãœããã¯ãã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããåŸãã³ã³ããã«ãã£ãŠåŒã³åºãããã
ãªããžããªãã¿ãŒã³ïŒäœ¿çšãã¹ãå Žåãšé¿ããã¹ãå Žå
ãªããžããªãã¿ãŒã³ã¯è°è«ãåŒã¶ãLaravelã®Eloquentã¯ãã§ã«Active Recordãå®è£ ããŠããããªããžããªã远å ããããšã§ãäžéšã®ããŒã ãäžèŠãšæããæœè±¡åãçãŸããã颿¥å®ã¯åè£è ã«èªåã®ç«å Žãæ£åœåããããæ±ããã
ãªããžããªã®å©ç¹ïŒ
- ããžãã¹ããžãã¯ãEloquentããåé¢ããããŒã¿ããŒã¹åãæ¿ããå¯èœã«ããïŒå®éã«ã¯ãŸãïŒ
- ãªããžããªã€ã³ã¿ãŒãã§ãŒã¹ãã¢ãã¯ããããšã§ãã¹ããç°¡çŽ å
- è€æ°ã®ã³ã³ãããŒã©ãé¡äŒŒã®ã¯ãšãªã䜿çšããå Žåã«ã¯ãšãªããžãã¯ãéäžå
å察æèŠïŒ
- CRUDæäœã«å¯ŸããŠæç¢ºãªå©ç¹ãªãã«ãã€ã©ãŒãã¬ãŒãã远å
- Eloquentã®ã¯ãšãªãã«ãã¯ãã§ã«è¡šçŸåè±ãã§ãã¹ãå¯èœ
- Laravelã®DIã¯ã¢ãã«ãšçŽæ¥é£æºå¯èœ
class OrderRepository
{
public function __construct(
private readonly Order $model
) {}
public function findPendingForUser(User $user): Collection
{
return $this->model->query()
->where('user_id', $user->id)
->where('status', OrderStatus::Pending)
->with('items.product')
->orderByDesc('created_at')
->get();
}
public function calculateRevenueForPeriod(CarbonPeriod $period): Money
{
$total = $this->model->query()
->whereBetween('completed_at', [$period->start, $period->end])
->where('status', OrderStatus::Completed)
->sum('total_cents');
return Money::ofMinor($total, 'USD');
}
}ãã©ã³ã¹ã®åããåçïŒã¯ãšãªããžãã¯ãè€éãªå Žåãã³ã³ããã¹ãéã§å ±æãããå ŽåããŸãã¯ããŒã ãã€ã³ã¿ãŒãã§ãŒã¹ã¢ãã¯ã«ãããã¹ãå®¹ææ§ãåªå ããå Žåããªããžããªã¯äŸ¡å€ã远å ãããåçŽãªCRUDã®å Žåãã¢ãã«ãçŽæ¥ã€ã³ãžã§ã¯ãããããšã§ã³ãŒããç°¡æœã«ä¿ãŠãã
ãã¹ãïŒãã£ãŒãã£ãŒãã¹ããã¢ãã¯ãããŒã¿ããŒã¹æŠç¥
Laravelã®ãã¹ãã«é¢ãã質åã§ã¯ãåè£è
ãä¿¡é Œæ§ãé«ãé«éãªãã¹ããæžãããã©ãããæ€èšŒããããã¬ãŒã ã¯ãŒã¯ã¯ãç°ãªããã¬ãŒããªããæã€RefreshDatabaseãDatabaseTransactionsãLazilyRefreshDatabaseãã¬ã€ããæäŸããŠããã
class OrderTest extends TestCase
{
use RefreshDatabase; // ã¯ã©ã¹ããšã«1åãã€ã°ã¬ãŒã·ã§ã³ããã¹ãããšã«ãã©ã³ã¶ã¯ã·ã§ã³
public function test_user_can_place_order(): void
{
// Arrange
$user = User::factory()->create();
$product = Product::factory()->create(['price_cents' => 2999]);
// Act
$response = $this->actingAs($user)
->postJson('/api/orders', [
'items' => [
['product_id' => $product->id, 'quantity' => 2],
],
]);
// Assert
$response->assertCreated()
->assertJsonPath('data.total_cents', 5998);
$this->assertDatabaseHas('orders', [
'user_id' => $user->id,
'status' => 'pending',
]);
}
public function test_order_dispatches_processing_job(): void
{
Queue::fake();
$user = User::factory()->create();
$order = Order::factory()->for($user)->create();
$this->actingAs($user)
->postJson("/api/orders/{$order->id}/process");
Queue::assertPushed(ProcessOrder::class, function ($job) use ($order) {
return $job->order->id === $order->id;
});
}
}RefreshDatabaseãã¬ã€ãã¯ããã¹ãã¯ã©ã¹ããšã«1åãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããåãã¹ããããŒã«ããã¯ãããã©ã³ã¶ã¯ã·ã§ã³ã§ã©ãããããããã«ãããé床ãšåé¢ã®ãã©ã³ã¹ãåãããå€§èŠæš¡ãªãã¹ãã¹ã€ãŒãã§ã¯ãLazilyRefreshDatabaseãã¹ããŒããäžèŽããå Žåã«ãã€ã°ã¬ãŒã·ã§ã³ãã¹ãããããã
å€éšãµãŒãã¹ã®ã¢ãã¯ã¯ããã¹ããå®éã®APIã«ã¢ã¯ã»ã¹ããã®ãé²ãã
public function test_payment_failure_returns_error(): void
{
$gateway = $this->mock(PaymentGateway::class);
$gateway->shouldReceive('charge')
->once()
->andThrow(new PaymentFailedException('Card declined'));
$user = User::factory()->create();
$order = Order::factory()->for($user)->create();
$response = $this->actingAs($user)
->postJson("/api/orders/{$order->id}/pay");
$response->assertStatus(402)
->assertJsonPath('error', 'Card declined');
}ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
颿¥ã§åºé¡ãããå¯èœæ§ãé«ãLaravel 13ã®æ©èœ
Laravel 13ã¯2026幎3æã«ãªãªãŒã¹ããã颿¥å®ãåè£è ã«çè§£ãæåŸ ããæ©èœãå«ãŸããŠãããå ¬åŒãªãªãŒã¹ããŒãã§ãããã®è©³çްã説æãããŠããã
AI SDKïŒLaravel 13ã«ã¯ããã¹ãçæããšã³ããã£ã³ã°ãããŒã«åŒã³åºããšãŒãžã§ã³ãçšã®çµ±äžAPIãåããããã¡ãŒã¹ãããŒãã£ã®AIããŒã«ãå«ãŸããŠãããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ãžã®AIæ©èœã®çµ±åã«ã€ããŠè³ªåãããå¯èœæ§ãããã
JSON:APIãªãœãŒã¹ïŒæ°ããJsonApiResourceã¯ã©ã¹ã¯ããªã¬ãŒã·ã§ã³ãã¹ããŒã¹ãã£ãŒã«ãã»ãããã³ã³ããŠã³ãããã¥ã¡ã³ããå«ãJSON:APIæºæ ã®ã¬ã¹ãã³ã¹æ§ç¯ãç°¡çŽ åããã
ãã¯ãã«æ€çŽ¢ïŒAsVector Eloquentãã£ã¹ãã¯ãã»ãã³ãã£ãã¯æ€çŽ¢çšã®ãã¯ãã«åãåŠçãããããã¯PostgreSQL pgvectorãšMariaDBã®ãã€ããªãã¯ãã«åœ¢åŒã§åäœããã
Cloudãã¡ãµãŒãïŒCloud::hosted()ã¯Laravel Cloudãããã€ã¡ã³ããæ€åºããCloud::usesManagedQueues()ã¯ãããŒãžããã¥ãŒæ¥ç¶ããã§ãã¯ãããããã«ãããèšå®ãã§ãã¯ãªãã§ç°å¢åºæã®åäœãå¯èœã«ãªãã
Laravel颿¥æºåã®ãã€ã³ã
with()ãloadMissing()ãwithCount()ã«ããN+1鲿¢ã説æãããå€§èŠæš¡ããŒã¿ã»ããã®ã€ãŒã¬ãŒããŒãã«ãããã¡ã¢ãªãžã®åœ±é¿ãçè§£ããŠããã- ãã¥ãŒãžã§ãèšèšã説æããïŒãªãã©ã€æŠç¥ã
SerializesModelsã®åäœããããã³ã°ã³ãŒã«ããã¯ãdeleteWhenMissingModelsã®äœ¿çšã¿ã€ãã³ã°ã - ãµãŒãã¹ã³ã³ããã®ãã€ã³ãã£ã³ã°ã¿ã€ããæç¢ºã«ããïŒã·ã³ã°ã«ãã³ vs ãã€ã³ããã³ã³ããã¹ããã€ã³ãã£ã³ã°ãããã©ãŒãã³ã¹åäžã®ããã®é å»¶ãããã€ãã
- ããã«ãŠã§ã¢ã®ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ãããŒãšãã¬ã¹ãã³ã¹åŸã®æäœã®ããã®ã¿ãŒãããã«ããã«ãŠã§ã¢ã宿Œããã
- ææ¡çãªã«ãŒã«ã§ã¯ãªããå ·äœçãªãã¬ãŒããªãã§ãªããžããªãã¿ãŒã³ã«ã€ããŠç«å Žã瀺ãã
RefreshDatabaseãé©åã«äœ¿çšããå€éšãµãŒãã¹ãã¢ãã¯ãããã¥ãŒãã£ã¹ããããã¢ãµãŒããããã¹ããæžãã- Laravel 13ã®æ©èœãç¹ã«AI SDKãJSON:APIãªãœãŒã¹ããã¯ãã«æ€çŽ¢æ©èœã«ã€ããŠææ°ã®ç¥èãç¶æããã
Laravel ã®ãã°ãèŠã€ããããŸãã
å®éã®ã³ãŒããé ãããã°ã1æ¥1åãã¢ã«ãŠã³ããªãã§è©ŠããŸãã

å·ç
Anthony Fillion-MailletSharpSkill 嵿¥è
10 幎以äžãã«ã¹ã¿ãã¯éçºã«æºãã£ãŠããŸããSharpSkill ãéå¶ããããã§å ¬éãããå 容ã«è²¬ä»»ãè² ã£ãŠããŸãã
2026幎9æ16æ¥ æŽæ°
å ±æ
é¢é£èšäº

Laravel Octane 2026å®å šã¬ã€ãïŒSwooleãšRoadRunnerã«ããããã©ãŒãã³ã¹æé©å
Laravel Octaneã䜿çšãããã€ããã©ãŒãã³ã¹PHPã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ¹æ³ã解説ãSwooleãšRoadRunnerã®éããèšå®æ¹æ³ããã¹ããã©ã¯ãã£ã¹ã颿¥å¯ŸçãŸã§ç¶²çŸ çã«è§£èª¬ããŸãã

PHP Laraveléçºè 颿¥è³ªå2026ïŒå®å šæºåã¬ã€ã
2026幎ã®Laravel 13察å¿ãEloquent ORMããµãŒãã¹ã³ã³ãããèªèšŒãã¿ãŒã³ããã¥ãŒåŠçããã¹ãæŠç¥ãªã©ãLaravelãšã³ãžãã¢é¢æ¥ã§åãããéèŠãããã¯ãç¶²çŸ çã«è§£èª¬ããŸãã

Laravel ãœãªã¥ãŒã·ã§ã³: é«åºŠãªãã¿ãŒã³ããããã°ã颿¥å¯Ÿç 2026幎ç
Laravel ã®é«åºŠãªã¢ãŒããã¯ãã£ãã¿ãŒã³ããããã°ææ³ã颿¥å¯Ÿçãç¶²çŸ çã«è§£èª¬ããµãŒãã¹ã¯ã©ã¹ããªããžããªãã¿ãŒã³ãTelescope ã«ãããããã°ãLaravel éçºè åãã®é »åºé¢æ¥è³ªåã詳ãã説æããŸãã