четверг, 13 июля 2017 г.

LARAVEL. РЕАЛИЗАЦИЯ СВЯЗЕЙ МЕЖДУ ТАБЛИЦАМИ.

Таблицы можно связывать по определенным полям, используя внешний ключ.

https://laravel.com/docs/5.4/eloquent-relationships

В файле \app\Http\Controllers\Admin\Core.php:

Добавим в БД пользователя в таблицу users.

Один к одному – одна запись таблицы привязывается к одной записи другой таблицы. 

Например, пользователь может проживать только в одном городе в текущий момент.
Создадим таблицу стран.

Создадим миграцию create_country_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCountrysTable extends Migration
{
   
    public function up()
    {
        Schema::create('countries', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('user_id')->unsigned()->default(1);
            
            $table->foreign('user_id')->references('id')->on('users'); // ссылка поля таблицы на поле id в табдице users
            
            $table->timestamps();
        });
    }

    
    public function down()
    {
        Schema::drop('countries');
    }
}
Применим миграцию через консоль: php artisan migrate

Создается страница. В структуре таблицы в Индексах мы увидим связь: 
countries_user_id_foreign
BTREE
Нет
Нет
user_id
0
A
Нет

Заполним таблицу.

Создаем модель Country, которая будет работать с таблицей countries. Идем в консоль и пишем: php artisan make:model Country

Открываем модель \app\User.php и там пишем метод для связи с моделью  Country

 public function country() {
 return $this->hasOne('App\Country'); 
 }

или так:

public function country() {
        return $this->hasOne('App\Country', 'user_id', 'id');
    }
}

В файле \app\Http\Controllers\Admin\Core.php найдем пользователя:
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB; // подключим БД
use App\Article; // подключим модель
use App\User;

class Core extends Controller
{
    protected static $articles;
    
    // В конструкторе мы также можем определить список посредников для работы.
    public function __construct() {
        //$this->middleware('mymiddle');
    }
    
    public static function addArticles($array) {
        return self::$articles[] = $array;
    }
    
    // Возвращает список материалов:
    public function getArticles() {    
        $user = User::find(1);
        dump($user->country);
    }
    
    // Возвращает один материал:
    public function getArticle($id) {
        echo $id;
    }
}
Теперь название страны мы можем сохранить в переменную:
 public function getArticles() { 
 $user = User::find(1);
 $country = $user->country();
 dump($user->country);
 }


Открываем модель \app\Country.php
Свяжем модели Country и User.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
    public function user() {
        return $this->belongsTo('App\User');
    }
}
В файле \app\Http\Controllers\Admin\Core.php найдем страну:
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB; // подключим БД
use App\Article; // подключим модель
use App\User;
use App\Country;

class Core extends Controller
{
 protected static $articles;
 
 // В конструкторе мы также можем определить список посредников для работы.
 public function __construct() {
 //$this->middleware('mymiddle');
 }
 
 public static function addArticles($array) {
 return self::$articles[] = $array;
 }
 
 // Возвращает список материалов:
 public function getArticles() { 
 
 $country = Country::find(1);
 dump($country);
 }
 
 // Возвращает один материал:
 public function getArticle($id) {
 echo $id;
 }
}

Теперь здесь же обратимся к пользователю:

 public function getArticles() { 
 
 $country = Country::find(1);
 dump($country->user);
 }
Связь Один ко Многим.
Один пользователь — много статьей.
Изменим структуру таблицы articles, добавим туда внешний ключ.
Создадим миграцию 2016_03_19_185508_add_articles_user_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddArticlesUserTable extends Migration
{
  
    public function up()
    {
        Schema::table('articles', function (Blueprint $table) {
            //
            $table->integer('user_id')->unsigned()->default(1);
            
            
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    
    public function down()
    {
        Schema::table('articles', function (Blueprint $table) {
            //
            $table->dropColumn('user_id');
        });
    }
}
В консоли пишем: php artisan migrate
В таблицу articles добавляется поле user_id со значением по умолчанию равным 1.

Открываем модель \app\User.php
public function articles() {
 return $this->hasMany('App\Article'); // один пользователь ко многим статьям
 }

 Открываем модель \app\User.php
 public function user() {
 return $this->belongsTo('App\User');
}
    

В файле \app\Http\Controllers\Admin\Core.php:
Получим все записи, которые добавил конкретный пользователь.
public function getArticles() { 
 $user = User::find(1);
 dump($user->articles);
 }
Выведем названия статей:
 public function getArticles() { 
 $user = User::find(1);
 $articles = $user->articles; // сохраним коллекцию моделей
 
 foreach($articles as $article) {
 echo $article->name.'<br />';
 } 
 
 }

Обратимся напрямую к методу articles
public function getArticles() { 
 $user = User::find(1); $articles = $user->articles(); 
 dump($articles);
 }
Возвращается специальный объект HasMany. Мы можем использовать методы конструктора запросов.

public function getArticles() {    
        $user = User::find(1);
        $articles = $user->articles()->where('id', 1)->first(); 
        dump($articles);
    }
В этом случае получаем объект одной конкретной записи.

Выберем все статьи с id > 1:
public function getArticles() {    
        $user = User::find(1);
        $articles = $user->articles()->where('id', '>', 1)->get(); 
        dump($articles);
    }

Выберем статью с id = 1:
public function getArticles() {    
        $article =  Article::find(1);
        dump($article);
    }
    
Мы также можем обратиться к пользователю:
public function getArticles() { 
 $article =  Article::find(1);
 dump($article->user);
 }

Мы можем распечатать его имя: dump($article->user->name);

Связь Многие ко Многим.
Создадим таблицы в БД: roles и role_users. Делаем миграции.
2016_03_20_155443_create_roles_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRolesTable extends Migration
{
    
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    
    public function down()
    {
        Schema::drop('roles');
    }
}
2016_03_20_155518_create_role_user_table.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRoleUserTable extends Migration
{
   
    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->increments('id');
            
            $table->integer('user_id')->unsigned()->default(1);
            $table->foreign('user_id')->references('id')->on('users');
            
            $table->integer('role_id')->unsigned()->default(1);
            $table->foreign('role_id')->references('id')->on('roles');
            
            $table->timestamps();
        });
    }

    
    public function down()
    {
        Schema::drop('role_user');
    }
}

Идем в консоль и пишем:  php artisan migrate

В таблицу roles добавляем роли  Admin и Moderator.
Идем в таблицу role_user. Добавляем роли. Пользователь с id = 1 будет соответствовать роли id = 1 и id = 2.

Сформируем модель Role. Идем в консоль и пишем: php artisan make:model Role

Откроем app\User.php и сформируем метод.
public function roles() {
        return $this->belongsToMany('App\Role'); // один пользователь может иметь несколько ролей
    }

Мы реализовали одностороннюю связь.
В файле \app\Http\Controllers\Admin\Core.php:

public function getArticles() {    
        $user = User::find(1);
        dump($user->roles);
    }
В результате такого запроса возвращается коллекция моделей.

Получим имена ролей пользователя.
public function getArticles() { 
 $user = User::find(1);
 
 foreach($user->roles as $role) {
 echo $role->name.'<br />';
 }
 
 dump($user->roles);
 }

Через обращение к методу мы получим доступ к методам конструктора объекта.
public function getArticles() { 
 $user = User::find(1);
 
 $role = $user->roles()->where('roles.id', 2)->first();
 dump($role);
 }

Определим двухстороннюю связь.  В app\Role.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users() {
        return $this->belongsToMany('App\User', 'role_user', 'role_id', 'user_id'); // role_user - имя таблицы для связи
    }
}
В файле \app\Http\Controllers\Admin\Core.php:

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB; // подключим БД
use App\Article; // подключим модель
use App\User;
use App\Country;
use App\Role;

class Core extends Controller
{
    protected static $articles;
    
    // В конструкторе мы также можем определить список посредников для работы.
    public function __construct() {
        //$this->middleware('mymiddle');
    }
    
    public static function addArticles($array) {
        return self::$articles[] = $array;
    }
    
    // Возвращает список материалов:
    public function getArticles() {  
       
        $role = Role::find(1);
        dump($role->users);
    }
    
    // Возвращает один материал:
    public function getArticle($id) {
        echo $id;
    }
}

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

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

Materialize-css. Футер

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