В Laravel принято определять соответствующую таблицу модели с помощью свойства table, например:
class User extends Model { protected $table = 'users'; }
Однако вместо непосредственного сопоставления с таблицей мы можем использовать подзапрос. Этот метод позволяет нам инкапсулировать сложные запросы на уровне приложения, подобно созданию представления базы данных, но с дополнительной гибкостью операций Eloquent.
Например, рассмотрим таблицу пользователей, в которой хранится информация как об администраторах, так и об обычных пользователях. Мы можем создать модель AdminUser, используя подзапрос:
class AdminUser { public function getTable(): string|\Illuminate\Contracts\Database\Query\Expression { $sql = User::query() ->select('id', 'name') ->where('admin_user', true) ->toRawSql(); return DB::raw(sprintf('(%s) as admin_users', $sql)); } }
Эта модель извлекает данные из подзапроса (выберите идентификатор, имя пользователя, где admin_user = 1), что позволяет вам запрашивать его так же, как стандартная модель:
AdminUser::query()->get();
или
AdminUser::query()->first();
Однако имейте в виду, что некоторые запросы, например find(1), не будут работать напрямую:
AdminUser::query()->find(1);
Чтобы обойти эту проблему, вы можете использовать условиеwhere в сочетании с first():
AdminUser::query()->where('id', 1)->first();
Приведенный пример является простой иллюстрацией того, как мы можем структурировать логику внутри модели. Однако этот подход можно масштабировать и адаптировать для гораздо более сложных сценариев. Используя такие структуры, мы можем эффективно управлять сложной логикой и извлекать ее, гарантируя, что наши модели останутся организованными, поддерживаемыми и масштабируемыми по мере их роста сложности.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3