【Laravel】 Eloquent の has() や whereHas() が遅い?なら速くしてやるぜPHPMySQLSQLLaravelEloquent はじめに 2021/10/21 追記: Postgres は MySQL と異なり,相関サブクエリの JOIN 最適化もカバーしています。それゆえ,主にこの記事の内容は MySQL を想定したものとなっております。 (情報提供: @KentarouTakeda) 2022/12/22 追記: MySQL もバージョン 8.0.16 以降では Postgres に似た最適化が入るようになりました。そのため,殆どの場合ではもはや has() whereHas() を素直に使うだけで十分になっています: 【ガチ検証】Eloquent whereHas() はもう遅くないよ! Laravel は「リレーション先が存在するか」という制約条件を
Do not speak Portuguese? Translate this site with Google or Bing Translator A cheat sheet for Laravel’s Eloquent ORM version 5.5. One to One Relationship Demo details: In this demo we have 2 models (Owner and Car), and 2 tables (owners and cars). Business Rules: The Owner can own one Car. The Car can be owned by one Owner. Relations Diagram: Relationship Details: The Cars table should store the Ow
Laravelでは各テーブルのプライマリーキーがAUTO_INCREMENT、つまり自動連番であることを前提にModelクラスがデフォルト設定されていますが、この設定は簡単にカスタマイズすることができます。 UUIDのメリット はじめに、自動連番ではなくUUIDをプライマリーキーとして使う理由について簡単にコメントします。 自動連番の代わりにUUIDを使うと、複数のデータベースで分散してデータを持つ場合やデータを移行する場合にもプライマリーキーの重複を避けられます。 また、多くの場合URLの一部にIDを使用しますが、私が担当した案件でクライアント様から「IDの予測がつきにくくしてほしい」という要望を受けたこともありますし(/users/123 があるなら122番ユーザーもいるとバレる)、別の案件では新規サービス開発時に「投稿IDが3とかだったらまだ使われてない感が出て格好悪い」と言われたこ
Laravel を使った開発でも、ドメインロジックと RDBMS などの永続化層へのアクセスを分離するためにリポジトリパターンを採用するケースが増えてきました。 ただ、Laravel には Eloquent という Active Record タイプの ORM があるので、これとリポジトリをどのように組み合わせるかで悩んでいる人が多いようで、これまで開発現場や勉強会などで質問を受けることがありました。 本エントリでは、リポジトリを実装してきた経験を元に、私が考える実装のポイントをご紹介します。 1. ドメインデータの入出力にリポジトリパターンを使う 2. メソッドの型宣言にドメインデータを指定する 3. 機械的に CRUD メソッドを実装しない 4. Eloquent を利用したリポジトリクラスの実装 5. 複数テーブルを扱うリポジトリ 6. Paginator との連携 さいごに 1.
Laravel を使った開発でも、ドメインロジックと RDBMS などの永続化層へのアクセスを分離するためにリポジトリパターンを採用するケースが増えてきました。 ただ、Laravel には Eloquent という Active Record タイプの ORM があるので、これとリポジトリをどのように組み合わせるかで悩んでいる人が多いようで、これまで開発現場や勉強会などで質問を受けることがありました。 本エントリでは、リポジトリを実装してきた経験を元に、私が考える実装のポイントをご紹介します。 1. ドメインデータの入出力にリポジトリパターンを使う 2. メソッドの型宣言にドメインデータを指定する 3. 機械的に CRUD メソッドを実装しない 4. Eloquent を利用したリポジトリクラスの実装 5. 複数テーブルを扱うリポジトリ 6. Paginator との連携 さいごに 1.
はじめに 過去にLaravel(5.6)のリクエストライフサイクルを中心にご紹介しました。 Deep Dive into Laravel 今回はEloquentの基本動作とリレーションについてご紹介したいと思います。その他のコレクションやミューテタなどの機能はここでは触れませんので公式サイトをご覧ください。 [公式サイト]Eloquent https://laravel.com/docs/5.6/eloquent 処理の流れ Eloquentの仕組みを見るために、まずは簡単なCRUD操作を例に基本的な内部処理の流れを見てみたいと思います。 Read 以下のようなモデルからデータを取得する処理の流れを順番に見てみます。 処理の流れを簡略化したものが以下のようになります(実際はもう少し複雑ですが分かりやすくするために省略しています)。 まず、アプリケーションモデルが継承する基底ModelがEl
Laravelでデータベースの追加や変更を行う際に、オリジナルの処理を行いたい場合についてサンプルを踏まえて説明します。 Eloquentモデルでは様々な処理を行う際に、各種のイベントを発火しようとするので、このイベントをフックすることによってオリジナルの処理を追加することができます。 Laravel公式ページには2つの方法が解説されていますが、これに加えて2つの計4つの方法を解説します。 イベントの種類 イベントを使用すると、特定のモデルクラスがデータベースに保存または更新されるたびに、簡単にオリジナルの処理を実行できます。 目的に沿ったイベントをフックしましょう。 retrieved creating created updating updated saving saved deleting deleted restoring restored 1. dispachesEcentプロ
1. アクセサでデータを作成 DBに存在しないアトリビュートをJSONのレスポンスで吐き出しができます。ゲッターとセッターを使うのは元々可能ですけど、アクセサで作られるアトリビュートがデフォルトでJSONになりません。そういうときは$appendsが助けてくれます! <?php class Store extends Model { $appends = ['products_count']; // ← ここを追加すると public function getProductsCountAttribute() { // 複数クエリーに気をつけてください :) return $this->product()->count(); } } class StoresController extends Controller { public function index() { return Sto
Laravelのマニュアルにない?小技: Eloquentのboot時にtraitのbootを別に走らせるPHPtraitLaravel こんにちはみなさん Laravelを半年以上使い続けてきたのですが、不気味なほどよくできているというか、「こんなんできないかなぁ」とか思うと、大体Laravelで完結できちゃったりします。 一方で、マニュアルを漁っても出てこない機能とかあって、結局ソース読んだりLaracastを見に行ったりするわけです。 そんなわけで今回は、いろんな使いみちがありそうなのに、マニュアルに見当たらなかった、Eloquentに関する小技を紹介します。 (SoftDelete眺めてたら見つけました)
LaravelのEloquentは、シンプルなデータ操作が可能なORMです。今回は、Eloquentのwhere系メソッドの使い方をケース別にまとめました。 題材として、よくあるブログのデータをサンプルに、where系メソッドの使い方を説明します。 ※ 本記事のサンプルはLaravel5.6で動作確認済みです。 テストデータ概要 サンプルとして上記のデータベースを利用します。 記事のデータ(Posts)があり、一人の著者と複数のタグが紐づくデータを想定しています。 記事と著者は1対多、記事とタグは多対多の関係となります。 部分一致記事のタイトルに対して、あるワードが含まれる記事を検索したいケースなどを想定しています。 Eloquentのwhereを使った実装は下記のようになります。 部分一致で検索したいため、whereの第二引数にLIKEを設定します。 $title = 'velit';
「クエリが大量に発行されているせいでタイムアウトしちゃってる」 といったことを避けるために重要な"Eager loading"。 Eloquent リレーションで Eager loading するにはなんとなく with メソドを使うということぐらいしか知らなかったので、 ドキュメントの Eloquent: Relationships > Eager loading の部分を読んでみました。 参考 公式ドキュメント https://laravel.com/docs/5.6/eloquent-relationships#eager-loading Eloquent のリレーション EloquentのリレーションはEloquentモデルにメソドで定義をする。 <?php namespace App; use Illuminate\Database\Eloquent\Model; class U
はじめに ウェブアプリケーションフレームワークのクラス構成にはさまざまなバリエーションがありますが、どれも様々なデザインパターンを駆使し、素晴らしいクラス構成になっています。 今回、じっくりフレームワークのソースコードを読むことで、少しでもいいクラス設計について学べるといいなぁと思い、このような企画を思いつきました。 PHP には様々なウェブアプリケーションフレームワークがあり、それぞれに特徴がありますが、今回は、近年突出して注目されている Laravel を取り上げます (いずれ他のフレームワークでも試してみたいです)。 環境 PHP 5.6.9 Laravel 5.2 やったこと Eloquent (Active Record) と DBファサード (Query Builder) の使い分け、ついでに Repository について Dependency Injection と Ser
イントロダクションIntroduction データベーステーブルは大抵の場合、他と関連しています。たとえばブログ投稿(ポスト)は多くのコメントを持つか、それを投稿したユーザーと関連しています。Eloquentはそうしたリレーションを簡単に管理し操作できるようにするとともに、様々なタイプのリレーションをサポートしています。Database tables are often related to one another. For example, a blog post may have many comments, or an order could be related to the user who placed it. Eloquent makes managing and working with these relationships easy, and supports seve
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く