lorisleiva / laravel-add-select
Installs: 5 461
Dependents: 0
Suggesters: 0
Security: 0
Stars: 33
Watchers: 4
Forks: 4
Open Issues: 0
Requires
- illuminate/support: ^5.8|^6.0|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^5.0
README
🧱 Add subSelect queries to your Laravel models using dynamic methods.
If you're not familiar with subSelect queries, I strongly recommend this article by Johnathan Reinink.
Installation
composer require lorisleiva/laravel-add-select
Usage
Consider two Eloquent models Book
and Chapter
such that a book can have multiple chapters.
By using the AddSubSelects
trait, you can now add subSelect queries to the Book
model by following the naming convention add{NewColumnName}Select
. For example, the following piece of code add two new subSelect queries to the columns last_chapter_id
and latest_version
.
class Book extends Model { use AddSubSelects; public function addLastChapterIdSelect() { return Chapter::select('id') ->whereColumn('book_id', 'books.id') ->latest(); } public function addLatestVersionSelect() { return Chapter::select('version') ->whereColumn('book_id', 'books.id') ->orderByDesc('version'); } }
Now, you can eager-load these subSelect queries using the withSelect
method.
Book::withSelect('last_chapter_id', 'latest_version')->get();
You can also eager-load models that are already in memory using the loadSelect
method. Note that this method will load all provided subSelect queries in one single database query.
$book->loadSelect('last_chapter_id', 'latest_version');
If you haven't eager-loaded these subSelect queries in a model, you can still access them as attributes. The first time you access them, They will cause a new database query but the following times they will be available in the model's attributes.
$book->last_chapter_id; $book->latest_version;
Finally, you can gloabally eager-load these subSelect queries by setting up the withSelect
property on the Eloquent model.
class Book extends Model { use AddSubSelects; public $withSelect = ['last_chapter_id', 'latest_version']; }