вторник, 18 июля 2017 г.

LARAVEL. ПРОЧИЕ МЕТОДЫ ПО РАБОТЕ СО СВЯЗЯМИ.

В файле App\Http\Controllers\Admin.php 
Работа со связями Один к одному.

public function getArticles() {
 $country = Country::find(1); $user = User::find(3); // выберем пользователя с id=3
 
 // метод associate() используется для изменения связей между моделями
 // метод associate()  изменяет значение внешнего ключа
 // Изменим состояние модели country:
 $country->user()->associate($user); // в моделе country метод user реализует связь между таблицами
 $country->save();
 }

Идем в БД. Теперь к стране будем привязан пользователь с id=3.
id  name  user_id  created_at  updated_at
1  USA  3  NULL 2017-07-18 17:19:31

Связь Один ко многим.
Сделаем так, что все статьи добавит пользователь по id=3
public function getArticles() {
 $articles = Article::all();
 $user = User::find(3);
 
 foreach($articles as $article) {
 $article->user()->associate($user); // привяжем пользователя к статье
 $article->save();
 }
 }

Связь Многие ко многим. Роли и пользователи. Здесь нет внешних ключей.
Внешние ключи располагаются в таблице role_user.
Назначим роль пользователю с id=3.

 public function getArticles() { 
 $user = User::find(3);
 $role_id = Role::find(2)->id; // Модератор
 
 /*
 Чтобы присоединить роль к пользователю вставкой записи в промежуточную таблицу, 
 которая присоединяется к моделям, 
 используйте метод attach():
 */
 $user->roles()->attach($role_id); 
 
 }

В БД в таблицу role_user добавится новая запись.

Чтобы удалить запись отношения многие-ко-многим, используйте метод detach(). Метод detach() удалит соответствующую запись из промежуточной таблицы. 

public function getArticles() { 
 $user = User::find(3);
 $role_id = Role::find(2)->id; // Модератор
 $user->roles()->detach($role_id); 
 
 }

Методы читатели и преобразователи.
Методы читатели или аксессорс - обращение к значению свойств модели.
Методы преобразователи или мутаторс - осуществляется  изменение свойств модели.    

Идем в модель app\Article.php

// У функций читателей сначала идет get в имени и потом идет Attribute. $value - значние свойства.
 public function getNameAttribute($value) {
 return 'Hello world - '.$value. ' - Hi!';
 }

В файле App\Http\Controllers\Admin.php 
public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 echo $article->name;
 }


Идем в браузер: http://tlaravel.loc/articles
Возвращается: Hello world - Header17 — Hi!

Метод преобразователь.
Идем в модель app\Article.php
// В начале у методов преобразователей идет set. Он изменяет значение свойства.
    public function setNameAttribute($value) {
        // некий код
        $this->attributes['name'] = '|'.$value.'|';
    }
    
В файле App\Http\Controllers\Admin.php 
Изменим свойство name модели Article.

public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 $article->name = 'Some text';
 echo $article->name;
 }

Идем в браузер: http://tlaravel.loc/articles
Возвращается: Hello world - |Some text| - Hi!

Закрытое свойство $casts определяет тип данных для каждого поля модели.
Преобразуем строковый заголовок в тип boolean.
Идем в модель app\Article.php
// определим массив типов данных для каждого поля модели
 protected $casts = [
 'name' => 'boolean'
 ];

В файле App\Http\Controllers\Admin.php 
Изменим свойство name модели Article.

public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 echo $article->name;
 }

Идем в браузер: http://tlaravel.loc/articles
Возвращается: 1

Рассмотрим тип преобразования array
Идем в модель app\Article.php

protected $casts = [
 'name' => 'boolean',
 'text' => 'array'
 ];

В файле App\Http\Controllers\Admin.php 
Изменим существующую запись.
 public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 $arr = ['key'=>'Hello wrold'];
 $article->text = $arr;
 $article->save();
 }

Теперь в БД в данной ячейки статьи располагается сериализованный массив JSON:
17  Header17  {"key":"Hello wrold"}  NULL 2017-07-16 16:54:33  2017-07-18 18:36:49  alias  NULL 3

Если мы обратимся к этому полю:
public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 dump($article->text);
 }

То выводится: 
array:1 [▼
  "key" => "Hello wrold"
]

Модель можно конвертировать в массив.
public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 dump($article->toArray());
    }

Выводит:
array:9 [▼
  "id" => 17
  "name" => true
  "text" => array:1 [▶]
  "img" => null
  "created_at" => "2017-07-16 16:54:33"
  "updated_at" => "2017-07-18 18:36:49"
  "alias" => "alias"
  "deleted_at" => null
  "user_id" => 3
]

Преобразуем в JSON:
public function getArticles() {        
        $article = Article::find(17); // статья с id=17
        dump($article->toJson());
    }


Выводит:
"{"id":17,"name":true,"text":{"key":"Hello wrold"},"img":null,"created_at":"2017-07-16 16:54:33","updated_at":"2017-07-18 18:36:49","alias":"alias","deleted_at": ▶"

Тот же результат будет, если мы приведем к строковому значению.
public function getArticles() { 
 $article = Article::find(17); // статья с id=17
 dump((string)$article);
 }


Выводит:
"{"id":17,"name":true,"text":{"key":"Hello wrold"},"img":null,"created_at":"2017-07-16 16:54:33","updated_at":"2017-07-18 18:36:49","alias":"alias","deleted_at": ▶"

Все методы для работы с коллекциями: https://laravel.com/docs/5.4/eloquent-collections

Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html