Как создать объединенную таблицу в Laravel Migration? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть таблица пользователей со следующими столбцами, в которой модель пользователя имеет отношение один ко многим с моделью телефона.

create_users_table.php

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

Тогда яиметь таблицу телефонов, которая имеет внешний ключ user_id create_phones_table.php

public function up()
{
    Schema::create('phones', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('user_id')->unsigned();
        $table->string('phone');
        $table->timestamps();

        $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
    });
}

Моя модель пользователя

<?php

namespace App;

use App\Phone;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * Define Relationship
     */

    public function phones()
    {
        return $this->hasMany(Phone::class);
    }
}

Моя модель телефона

<?php

    namespace App;

    use App\User;
    use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    protected $table = 'phones';
    protected $fillable = ['phone' , 'user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Я хотел бы иметь третью таблицу в моей базе данных call phone_user_table.php. Что-то вроде сводной таблицы, где я соединил пользовательскую таблицу и телефонную таблицу, где я могу видеть все записи. Это мой код, в котором я пытаюсь присоединиться к таблице.

create_phone_user.php

<?php

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

class CreatePhoneUser extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('phone_user', function (Blueprint $table) {

            $table->unsignedBigInteger('user_id')->unsigned();
            $table->unsignedBigInteger('phone_id')->unsigned();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('phone_id')->references('id')->on('phones')->onDelete('cascade');

            $table->timestamps();

            $table 
            ->join('users', 'users.id', '=', 'phone_user.user_id')
            ->join('phones', 'phones.id', '=', 'phone_user.phone_id')
            ->select('phone_user.*', 'users.name', 'phones.phone')
            ->get();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('phone_user');
    }
}

Однако, похоже, что телефоны Базовой таблицы уже существуют.

Ценю всю предоставленную помощь.

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2019

Вот как это работает на основе Документов об отношениях между многими и многими.

Первый

Вам необходимо создать 2 modelчто вы хотели бы иметь отношения.

В вашем примере у вас есть отношения USER и PHONE .

В вашем Модель пользователя Вам необходимо объявить отношения следующим образом:

public function phones() {
  return $this->belongsToMany(Phone::Class);
}

А В вашей модели телефона вы можете сделать так:

public function users() {
  return $this->belongsToMany(User::Class);
}

SECOND

Вам нужно иметь 3 migration, один для user, phone, а также phone_user. Таким образом, это должно выглядеть следующим образом.

Миграция пользователя телефона

Schema::create('phone_user', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->unsignedBigInteger('phone_id')->index();
  $table->unsignedBigInteger('user_id')->index();
  $table->timestamps();

  $table->foreign('phone_id')->references('id')->on('phones')->onDelete('cascade');
  $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Примечание: вам не нужно иметь unsignedBigInteger в обоих user и phone migration.

Если у вас есть user list и phone list, теперь вы можете назначить phone на user следующим образом:

Контроллер

$user = User::find(1);
$phone = Phone::find(1);

$user->phones()->attach($phone);
...