Поиск…
Вступление
The Eloquent - это ORM (реляционная модель объекта), включенная в Laravel. Он реализует активный шаблон записи и используется для взаимодействия с реляционными базами данных.
замечания
Именование таблиц
Соглашение заключается в использовании множественных «snake_case» для имен таблиц и уникальной «StudlyCase» для имен моделей. Например:
- В таблице
cats
будет модельCat
- В таблице
jungle_cats
была бы модельJungleCat
- Таблица
users
будет иметьUser
модель - Таблица
people
будет иметь модельPerson
«Красноречивый» автоматически попытается привязать вашу модель таблицей с множественным числом имени модели, как указано выше.
Однако вы можете указать имя таблицы, чтобы переопределить соглашение по умолчанию.
class User extends Model
{
protected $table = 'customers';
}
Вступление
Красноречивый - это ORM, встроенный в структуру Laravel. Он позволяет взаимодействовать с вашими таблицами базы данных объектно-ориентированным способом с использованием шаблона ActiveRecord .
Один класс модели обычно сопоставляется с одной таблицей базы данных, а также отношения разных типов ( один-к-одному , один-ко-многим , много-ко-многим , полиморфные) могут быть определены между различными классами моделей.
Раздел « Создание модели» описывает создание и определение классов моделей.
Прежде чем вы сможете начать использовать модели Eloquent, убедитесь, что в конфигурационном файле config/database.php
указано как минимум одно соединение с config/database.php
.
Чтобы понять использование конструктора запросов красноречивых запросов во время разработки, вы можете использовать команду php artisan ide-helper:generate
. Вот ссылка .
Подкатегория Навигация
Упорно
Помимо чтения данных с помощью Eloquent, вы также можете использовать его для вставки или обновления данных с помощью метода save()
. Если вы создали новый экземпляр модели, запись будет вставлена ; в противном случае, если вы извлекли модель из базы данных и установили новые значения, она будет обновлена .
В этом примере мы создаем новую запись User
:
$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();
Вы также можете использовать метод create
для заполнения полей с помощью массива данных:
User::create([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
При использовании метода create ваши атрибуты должны быть объявлены в fillable
массиве в вашей модели:
class User extends Model
{
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
}
В качестве альтернативы, если вы хотите, чтобы все атрибуты были назначены массами, вы можете определить свойство $ guarded как пустой массив:
class User extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
}
Но вы также можете создать запись даже без изменения fillable
атрибута в модели, используя forceCreate
метод , а не create
метод
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Ниже приведен пример обновления существующего User
модели по первой загрузке (с помощью find
), изменяя его, а затем сохранить его:
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
Чтобы выполнить тот же подвиг с помощью одного вызова функции, вы можете использовать метод update
:
$user->update([
'password' => bcrypt('my_new_password'),
]);
Способы create
и update
делают работу с большими наборами данных намного проще, чем устанавливать каждую пару ключ / значение отдельно, как показано в следующих примерах:
Обратите внимание на использование
only
иexcept
сбора данных запроса. Важно указать точные ключи, которые вы хотите разрешить / запретить для обновления, в противном случае злоумышленник может отправить дополнительные поля с их запросом и вызвать непреднамеренные обновления.
// Updating a user from specific request data
$data = Request::only(['first_name', 'email']);
$user->find(1);
$user->update($data);
// Create a user from specific request data
$data = Request::except(['_token', 'profile_picture', 'profile_name']);
$user->create($data);
Удаление
Вы можете удалить данные после их записи в базу данных. Вы можете либо удалить экземпляр модели, если вы ее получили, либо указать условия для удаления записей.
Чтобы удалить экземпляр модели, извлеките его и вызовите метод delete()
:
$user = User::find(1);
$user->delete();
В качестве альтернативы вы можете указать первичный ключ (или массив первичных ключей) записей, которые вы хотите удалить с помощью метода destroy()
:
User::destroy(1);
User::destroy([1, 2, 3]);
Вы также можете комбинировать запрос с удалением:
User::where('age', '<', 21)->delete();
Это приведет к удалению всех пользователей, которые соответствуют условию.
Примечание: При выполнении массового удаления заявления с помощью красноречивого, то
deleting
иdeleted
моделей событий не будут срабатывать для удаленных моделей. Это связано с тем, что модели никогда не извлекаются при выполнении инструкции delete.
Мягкое удаление
Иногда вы не хотите окончательно удалять запись, но сохраняйте ее для целей аудита или отчетности. Для этого Eloquent предоставляет функции мягкого удаления .
Чтобы добавить функциональность мягких удалений в вашу модель, вам нужно импортировать свойство SoftDeletes
и добавить его в класс модели Eloquent:
namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
При удалении модели она установит deleted_at
метку в столбце timestamp deleted_at
в таблице для вашей модели, поэтому deleted_at
столбец deleted_at
в своей таблице. Или в процессе миграции вы должны вызвать softDeletes()
в своем deleted_at
чтобы добавить deleted_at
времени deleted_at
. Пример:
Schema::table('users', function ($table) {
$table->softDeletes();
});
В любых запросах будут отсутствовать записи с мягким удалением. Вы можете принудительно показать их, если хотите, используя область withTrashed()
:
User::withTrashed()->get();
Если вы хотите разрешить пользователям восстанавливать запись после мягкого удаления (т. Е. В области типа корзины), вы можете использовать метод restore()
:
$user = User::find(1);
$user->delete();
$user->restore();
Чтобы принудительно удалить запись, используйте метод forceDelete()
который действительно удалит запись из базы данных:
$user = User::find(1);
$user->forceDelete();
Изменение первичного ключа и временных меток
По умолчанию модели Eloquent ожидают, что первичный ключ будет называться 'id'
. Если это не ваше дело, вы можете изменить имя вашего первичного ключа, указав свойство $primaryKey
.
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
Теперь все методы Eloquent, которые используют ваш первичный ключ (например, find
или findOrFail
), будут использовать это новое имя.
Кроме того, Eloquent ожидает, что первичный ключ будет автоматически увеличивающимся целым числом. Если ваш основной ключ не является автоматически увеличивающимся целым числом (например, GUID), вам нужно сообщить Eloquent, обновив свойство $incrementing
на false
:
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
По умолчанию Eloquent ожидает, что в ваших таблицах created_at
updated_at
столбцы created_at
и updated_at
. Если вы не хотите, чтобы эти столбцы автоматически управлялись Eloquent, установите для свойства $timestamps
на вашей модели значение false:
class Citizen extends Model
{
public $timestamps = false;
// ...
}
Если вам нужно настроить имена столбцов, используемых для хранения временных меток, вы можете установить CREATED_AT
и UPDATED_AT
в своей модели:
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
Выбросить 404, если объект не найден
Если вы хотите автоматически генерировать исключение при поиске записи, которая не найдена в модальном, вы можете использовать либо
Vehicle::findOrFail(1);
или же
Vehicle::where('make', 'ford')->firstOrFail();
Если запись с первичным ключом 1
не найдена, ModelNotFoundException
. Это по сути то же самое, что и запись ( источник просмотра ):
$vehicle = Vehicle::find($id);
if (!$vehicle) {
abort(404);
}
Модели клонирования
Возможно, вам нужно клонировать строку, возможно, изменить несколько атрибутов, но вам нужен эффективный способ держать вещи сухими. Laravel предоставляет своего рода «скрытый» метод, позволяющий вам выполнять эту функцию. Хотя он полностью недокументирован, вам нужно найти через API, чтобы его найти.
Используя $model->replicate()
вы можете легко клонировать запись
$robot = Robot::find(1);
$cloneRobot = $robot->replicate();
// You can add custom attributes here, for example he may want to evolve with an extra arm!
$cloneRobot->arms += 1;
$cloneRobot->save();
Вышеупомянутый найдет робота, который имеет идентификатор 1, а затем клонирует его.