Таблицы можно связывать по определенным полям, используя внешний ключ.
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;
}
}
Комментариев нет:
Отправить комментарий