Поиск…


Вступление

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, а затем клонирует его.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow