воскресенье, 16 июля 2017 г.

LARAVEL. МАНИПУЛЯЦИ СО СВЯЗАННЫМИ ЗАПИСЯМИ

В файле App\Http\Controllers\Admin.php 
Пример ленивой загрузки.
 public function getArticles() {  
        $articles = Article::all();
        //dump($articles);  // дает коллекцию моделей, при этом выполняется всего один запрос
        foreach($articles as $article) {
            // dump($article->user); 
            echo $article->user->name; // на каждой итерации цикла выполняется запрос к БД. Это дает нагрузку на сервер.
        }
        
    }

Как избежать постоянного обращения к БД? Реализуем жадную загрузку.
public function getArticles() { 
 $articles = Article::with('user')->get(); // кол-во запросов сокращается
 
 foreach($articles as $article) { 
 echo $article->user->name; 
 }
 
 }
 
Мы можем реализовать жадную загрузку с использованием метода all() и load().
public function getArticles() { 
 $articles = Article::all(); 
 // Здесь, например, идет какой-то код.
 $articles->load('user'); // используют для дозагрузки в коллекцию необходимых связанных данных
 foreach($articles as $article) { 
 echo $article->user->name; 
 } 
 }

Подгрузка данных из нескольких связанный таблиц, используя all().
public function getArticles() { 
 $users = User::all(); // сохраняется коллекция моделей
 foreach($users as $user) {
 // dump($user->articles); // дает коллекцию статей, которую добавил каждый пользователь.
 dump($user->roles); // дает роли пользователя
 }
 }

Подгрузка данных из нескольких связанный таблиц с жадной загрузкой.
public function getArticles() { 
 $users = User::with('articles', 'roles')->get(); // подгрузим данные из таблицы articles и roles
 foreach($users as $user) { 
 dump($user->roles); // дает роли пользователя
dump($user->articles); // дает статьи пользователя
        }
 }
 }


Метод has() позволяет выбрать информацию для конкретной модели, если у нее есть определенная связующая модель из другой таблицы. 
 public function getArticles() {
 // У модели конкретного пользователя есть связанная модель Article
 $users = User::has('articles')->get(); // получим пользователей, которые добавили информацию в таблицу articles
 foreach($users as $user) { 
 dump($user); // дает статьи пользователя
 }
 }
 
В методе has() можно определить условие. Выберем пользователя, который имеет 3 и более статьей.
  public function getArticles() {
        // У модели конкретного пользователя есть связанная модель Article
        $users = User::has('articles', '>=', '3')->get(); // получим пользователей, которые добавили информацию в таблицу articles
        foreach($users as $user) {            
            dump($user); // дает статьи пользователя
        }
    }


Манипуляции с информацией в БД.
Добавим статью в таблицу articles.

public function getArticles() {
 $user = User::find(1); // выберем пользователя с id=1
 $article = new Article([
 'name' => 'New Article',
 'text' => 'New Text',
 'img' => 'newimg.jpg',
 ]); // сформируем информацию для передачу в БД
 $user->articles()->save($article); // здесь мы работаем с методом, а не с динамическими свойствами. Метод articles() находится в моделе app/User.php
 
 $arlicles = Article::all();
 dump($arlicles);
 }

Используем метод create для сохранения в БД. В отличие от метода save(), которые принимает модель, метод create() принимает массив данных. 
 public function getArticles() {
 $user = User::find(1); // выберем пользователя с id=1
 $user->articles()->create([
 'name' => 'New Article2',
 'text' => 'New Text2',
 'img' => 'newimg2.jpg',
 
 ]); // находится в моделе app/User.php
 
 $arlicles = Article::all();
 dump($arlicles);
    }

Метод saveMany().
public function getArticles() {
 $user = User::find(1); // выберем пользователя с id=1
 $user->articles()->saveMany([
 new Article(['name' => 'New Article3', 'text' => 'New Text3', 'img' => 'newimg3.jpg']),
 new Article(['name' => 'New Article4', 'text' => 'New Text4', 'img' => 'newimg4.jpg'])
 ]); 
 
 $arlicles = Article::all();
 dump($arlicles);
 }

Сформируем новую роль для пользователя.

Идем в модель ролей app\Role.php и разрешаем заполнять колонку таблицы с именем:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
 protected $fillable = ['name'];
 
 public function users() {
 return $this->belongsToMany('App\User', 'role_user', 'role_id', 'user_id'); // role_user - имя таблицы для связи
 }
}

В файле App\Http\Controllers\Admin.php 
public function getArticles() {
 $user = User::find(1);
 $role = new Role(['name'=>'guest']);
 $user->roles()->save($role);
 }
 
Редактирование данных. Изменим заголовок статьи с id = 17.
В файле App\Http\Controllers\Admin.php 
 public function getArticles() {
 $user = User::find(1);
 $user->articles()->where('id', 17)->update(['name' => 'Header17']);
 
 $articles = Article::find(17);
 dump($articles);
 }

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

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

Materialize-css. Футер

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