Я знаю, как создать модель - 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, какие конфигурации я должен установить в файле миграции или в файле модели?
Предположим, у вас есть еще одна модель 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.
вы используете это как...
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');
}
}
проверьте его.. может быть, он отлично работает....
adresses
и уuser
есть функция, позволяющая определить, какая связь существует между таблицами, но когда вызываются функции?