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

Я знаю, как создать модель — 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, какие конфигурации я должен установить в файле миграции или в файле модели?

1

Решение

Предположим, у вас есть другой пользователь модели с именем таблицы 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');
});
}

В классе модели User,

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');
}

}

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

ОБНОВИТЬ

В соответствии с этот вопрос, вам придется создать ссылочную таблицу, прежде чем ссылаться на таблицу. В нашем случае 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.

1

Другие решения

Вы можете использовать как это …

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');
}

}

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

0

По вопросам рекламы [email protected]