В файле 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);
}
Комментариев нет:
Отправить комментарий