В этой статье мы рассмотрим мутаторы и аксессоры Eloquent ORM в веб-фреймворке Laravel. После введения мы рассмотрим несколько примеров, чтобы понять эти концепции.
В Laravel мутаторы и аксессоры позволяют вам изменять данные перед их сохранением и извлечением из базы данных. Чтобы быть конкретным, мутатор позволяет вам изменять данные, прежде чем они будут сохранены в базе данных. С другой стороны, средство доступа позволяет изменять данные после их извлечения из базы данных.
Фактически, модель Laravel является центральным местом, где вы можете создавать методы мутатора и метода доступа. И, конечно, приятно, что все ваши модификации находятся в одном месте, а не разбросаны по разным местам.
Создание аксессоров и мутаторов в модельном классе
Поскольку вы уже знакомы с основной концепцией мутаторов и аксессоров, мы продолжим и разработаем реальный пример, чтобы продемонстрировать это.
Я предполагаю, что вам известна модель Eloquent в Laravel, и мы будем использовать модель Post в качестве отправной точки нашего примера. Если вы еще не создали модель Post , давайте воспользуемся командой artisan для ее создания.
|
1
|
php artisan make:model Post —migration
|
Это должно создать файл модели в app/Post.php как показано ниже.
|
01
02
03
04
05
06
07
08
09
10
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//
}
|
Давайте заменим содержимое этого файла следующим.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = [
‘created_at’,
‘updated_at’,
‘published_at’
];
/**
* Get the post title.
*
* @param string $value
* @return string
*/
public function getNameAttribute($value)
{
return ucfirst($value);
}
/**
* Set the post title.
*
* @param string $value
* @return string
*/
public function setNameAttribute($value)
{
$this->attributes[‘name’] = strtolower($value);
}
}
|
Поскольку мы использовали параметр --migration , он также должен создавать связанную миграцию базы данных. На случай, если вы не знаете, вы можете выполнить следующую команду, чтобы она фактически создала таблицу в базе данных.
|
1
|
php artisan migrate
|
Чтобы запустить примеры из этой статьи, вам нужно создать столбцы name и publ_at в таблице записей. В любом случае, мы не будем вдаваться в подробности темы миграции, поскольку она выходит за рамки этой статьи. Итак, вернемся к интересующим нас методам.
Во-первых, давайте пройдем через метод мутатора.
|
01
02
03
04
05
06
07
08
09
10
|
/**
* Set the post title.
*
* @param string $value
* @return string
*/
public function setNameAttribute($value)
{
$this->attributes[‘name’] = strtolower($value);
}
|
Как мы уже говорили ранее, мутаторы используются для изменения данных перед их сохранением в базе данных. Как видите, синтаксис метода-мутатора set{attribute-name}Attribute . Конечно, вам нужно заменить {attribute-name} на фактическое имя атрибута.
Метод setNameAttribute вызывается перед сохранением значения атрибута name в базе данных. Для простоты мы просто использовали функцию strtolower которая преобразует заголовок записи в нижний регистр, прежде чем он будет сохранен в базе данных.
Таким образом, вы можете создавать методы-мутаторы во всех столбцах таблицы. Далее, давайте рассмотрим метод доступа.
Если мутаторы используются для изменения данных до их сохранения в базе данных, метод доступа используется для изменения данных после их извлечения из базы данных. Синтаксис метода доступа такой же, как и у мутатора, за исключением того, что он начинается с ключевого слова get вместо ключевого слова set.
Давайте рассмотрим метод getNameAttribute .
|
01
02
03
04
05
06
07
08
09
10
|
/**
* Get the post title.
*
* @param string $value
* @return string
*/
public function getNameAttribute($value)
{
return ucfirst($value);
}
|
Метод getNameAttribute будет вызываться после getNameAttribute значения атрибута name из базы данных. В нашем случае мы просто использовали метод ucfirst чтобы изменить заголовок поста.
И именно так вы должны использовать аксессоры в своих моделях. Пока что мы только что создали методы мутатора и метода доступа, и мы протестируем их в следующем разделе.
Мутаторы в действии
Давайте создадим контроллер в app/Http/Controllers/MutatorController.php чтобы мы могли протестировать метод мутатора, который мы создали в предыдущем разделе.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
<?php
// app/Http/Controllers/MutatorController.php
namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class MutatorController extends Controller
{
public function index()
{
// create a new post object
$post = new Post;
$post->setAttribute(‘name’, ‘Post title’);
$post->save();
}
}
|
Кроме того, вам нужно создать связанный маршрут в файле routes/web.php для доступа к нему.
|
1
|
Route::get(‘mutator/index’, ‘MutatorController@index’);
|
В методе index мы создаем новый пост, используя модель Post . Он должен установить значение столбца name для публикации заголовка, так как мы использовали функцию strtolower в setNameAttribute мутатора setNameAttribute .
Дата Мутаторы
В дополнение к мутатору, который мы обсуждали ранее, модель Eloquent предоставляет несколько специальных мутаторов, которые позволяют изменять данные. Например, модель Eloquent в Laravel поставляется со специальным свойством $dates date, которое позволяет автоматически преобразовывать нужные столбцы в экземпляр даты Carbon .
В начале этой статьи мы создали модель Post , и следующий код был частью этого класса.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
…
…
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = [
‘created_at’,
‘updated_at’,
‘published_at’
];
…
…
|
Как вы, вероятно, знаете, Laravel всегда создает два связанных с датой поля, created_at и updated_at , с каждой миграцией базы данных. И он также преобразует эти значения в экземпляр даты Carbon .
Предположим, у вас есть пара полей в таблице, которые вы хотели бы рассматривать как поля даты. В этом случае вам просто нужно добавить имена столбцов в массиве $dates date.
Как видно из приведенного выше кода, мы добавили столбец publ_at в массив $dates date, и он гарантирует, что значение этого столбца будет преобразовано в экземпляр даты Carbon .
Accessors в действии
Чтобы увидеть аксессоры в действии, давайте создадим файл контроллера app/Http/Controllers/AccessorController.php со следующим содержимым.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class AccessorController extends Controller
{
public function index()
{
// load post
$post = Post::find(1);
// check the name property
echo $post->name;
// check the date property
echo $post->published_at;
// as we’ve mutated the published_at column as Carbon date, we can use following as well
echo $post->published_at->getTimestamp();
exit;
}
}
|
Также давайте создадим связанный маршрут в файле routes/web.php для доступа к нему.
|
1
|
Route::get(‘accessor/index’, ‘AccessorController@index’);
|
В методе index мы сначала использовали модель Post чтобы загрузить пример сообщения.
Далее мы проверяем значение столбца имени, и оно должно начинаться с заглавной буквы, так как мы уже определили метод getNameAttribute для этого столбца.
Двигаясь дальше, мы проверили значение published столбца _at , и это следует рассматривать как дату. Благодаря этому Laravel преобразует его в экземпляр Carbon, чтобы вы могли использовать все служебные методы, предоставляемые этой библиотекой. В нашем случае мы использовали метод getTimestamp для преобразования даты в метку времени.
И это подводит нас к концу этой статьи!
Вывод
Сегодня мы изучили концепции мутаторов и аксессоров Eloquent ORM в Laravel. Он предоставляет хороший способ изменить данные перед их сохранением и извлечением из базы данных.
Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, сайт или приложение с помощью расширений, у нас есть множество вещей, которые вы можете изучить на Envato Market .
Не стесняйтесь поделиться своими мыслями, используя канал ниже!