如何管理模型的关系(fk)?
How to manage relationships(fk) of models?
我知道如何创建模型 - php artisan make:model nameofmodel
,我知道在模型迁移中我必须声明 table 将具有哪些列:
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 关联两个模型,我必须在迁移文件或模型文件中设置哪些配置?
假设您有另一个具有 table 名称 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,
class User extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'users';
public function addresses()
{
return $this->hasMany('App\Address');
}
}
在地址 class
class Address extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'addresses';
public function user()
{
return $this->belongsTo('App\User');
}
}
有关创建 table 的更多详细信息,请参见官方 Schema Docs on Laravel. And More information about Relation ship here
更新
根据 问题,在引用 table 之前,您必须先创建引用 table。在我们的例子中,users
必须在您 运行 迁移之前存在以创建 addresses
table。
简单用例
假设,在控制器中你想知道特定用户有多少个地址,你可以像下面那样做,
$addressCount = User::find($userId)->addresses->count();
请注意 User::find($userId)->addresses
returns 相关模型集合,而 User::find($userId)->addresses()
returns 对象类型 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
不会 return 集合,而是 class 用户的单个对象。这是因为 belongsTo
关系。
希望我已经为您说清楚了。但是没有官方的好docs.
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');
}
}
检查它..可能它工作正常....
我知道如何创建模型 - php artisan make:model nameofmodel
,我知道在模型迁移中我必须声明 table 将具有哪些列:
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 关联两个模型,我必须在迁移文件或模型文件中设置哪些配置?
假设您有另一个具有 table 名称 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,
class User extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'users';
public function addresses()
{
return $this->hasMany('App\Address');
}
}
在地址 class
class Address extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'addresses';
public function user()
{
return $this->belongsTo('App\User');
}
}
有关创建 table 的更多详细信息,请参见官方 Schema Docs on Laravel. And More information about Relation ship here
更新
根据 users
必须在您 运行 迁移之前存在以创建 addresses
table。
简单用例
假设,在控制器中你想知道特定用户有多少个地址,你可以像下面那样做,
$addressCount = User::find($userId)->addresses->count();
请注意 User::find($userId)->addresses
returns 相关模型集合,而 User::find($userId)->addresses()
returns 对象类型 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
不会 return 集合,而是 class 用户的单个对象。这是因为 belongsTo
关系。
希望我已经为您说清楚了。但是没有官方的好docs.
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');
}
}
检查它..可能它工作正常....