Как управлять отношениями (ФК) моделей?

1

Я знаю, как создать модель - php artisan make:model nameofmodel, я знаю, что при миграции модели я должен объявить, какие столбцы будут иметь таблица:

class CreateNameofmodelTable extends Migration {

     /**
     * Run the migrations.
     *
     * @return void
     */
     public function up()
     {
        Schema::create('nameofmodels', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('description');
            $table->timestamps();
        });
    }

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

Но если я хочу связать две модели с помощью FK, какие конфигурации я должен установить в файле миграции или в файле модели?

Теги:
laravel-5
artisan
foreign-key-relationship

2 ответа

1
Лучший ответ

Предположим, у вас есть еще одна модель User с именами users таблиц. вы можете иметь отношения, определенные между addresses и users следующим образом:

public function up()
    {
        Schema::create('addresses', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('add1');
            $table->string('add2');
            $table->string('city');
            $table->string('contact_no');
            $table->enum('is_primary',['yes','no'])->default('no');
            $table->integer('user_id')->unsigned();
            $table->timestamps();

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

В классе модели пользователя,

class User extends Model {
   /**
   * The table associated with the model.
   *
   * @var string
   */
    protected $table = 'users';

    public function addresses()
    {
        return $this->hasMany('App\Address');
    }

}

в классе адресов

class Address extends Model {
    /**
    * The table associated with the model.
    *
    * @var string
    */
   protected $table = 'addresses';

    public function user()
    {
        return $this->belongsTo('App\User');
    }

}

Более подробную информацию о создании таблицы можно найти в Официальных Документах Схемы на Laravel. И дополнительная информация о Relation ship here

ОБНОВИТЬ

В соответствии с этим вопросом вам нужно будет создать ссылочную таблицу сначала перед ссылкой на таблицу. В нашем случае users должны существовать до запуска миграции для создания таблицы addresses.

Простой случай использования

предположим, что в контроллере вы хотите узнать, сколько адресов у конкретных пользователей, вы можете сделать следующее:

$addressCount = User::find($userId)->addresses->count();

Обратите внимание, что User::find($userId)->addresses возвращает коллекцию связанных моделей, в то время как User::find($userId)->addresses() возвращает объект типа HasMany

вы также можете перемещать коллекцию, как показано ниже,

foreach(User::find($userId)->addresses as $address)
{
    echo '<pre>';
    print_r($address);
}

С другой стороны, вы можете получить пользователя, связанного с конкретным адресом, как показано ниже,

$user = Address:find($addressId)->user; //returns object of type 'User'
echo $user->first_name;

следующий не будет работать

$user = Address:find($addressId)->user(); //returns object of type 'belongsTo'
echo $user->first_name;

Примечание: выше Address:find($addressId)->user не будет возвращать коллекцию, кроме одного объекта класса User. Это происходит потому, что в belongsTo отношений.

Надеюсь, я разъяснил вам. Но ничего хорошего, как официальные документы.

Видео Laracast даже лучше ладить с Laravel.

  • 0
    Не могли бы вы объяснить, что происходит в классах Users и Address? Я имею в виду, что я понимаю, что функции adresses и у user есть функция, позволяющая определить, какая связь существует между таблицами, но когда вызываются функции?
  • 0
    Я получаю ошибку 150, она ссылается на FK, но я не уверен, что laravel обрабатывает миграции в порядке их создания или оценивает, должна ли таблица существовать до пыльника из-за fks
Показать ещё 1 комментарий
0

вы используете это как...

class CreateNameofmodelTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('nameofmodels', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name')->unique();
        $table->string('description');
        $table->timestamps();
    });
Schema::create('your table name', function(Blueprint $table) {
  $table->foreign('user_id')->references('id')->on('nameofmodels');
}

}

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

}

проверьте его.. может быть, он отлично работает....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню