1、一对一
一对一是最简单的关联关系,表示表A和表B的记录一一对应,比如一个用户对应一个社交账号,在演示该关联关系之前我们先创建一个社交账号表user_accounts:
php artisan make:migration create_user_accounts_table --create=user_accounts
编辑生成的迁移文件如下:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUserAccountsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_accounts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->string('qq',20)->nullable();
$table->string('weixin',100)->nullable();
$table->string('weibo',100)->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('user_accounts');
}
}
然后运行Artisan命令:
php artisan migrate
再使用如下Artisan命令生成模型UserAccount:
php artisan make:model Models/UserAccount
接下来我们开始在User中定义与UserAccount的一对一对应关系:
public function account()
{
return $this->hasOne('App\Models\UserAccount');
}
最后在控制器中编写测试代码如下:
$account = User::find(1)->account; dd($account);
浏览器中会输出相对应的UserAccount模型实例。
相对的,我们也可以在UserAccount模型中定义与User的一对一关系:
public function user()
{
return $this->belongsTo('App\User');
}
相应的测试代码为:
$user = UserAccount::find(1)->user; dd($user);
上述代码会输出相应的User模型实例。
上述代码会输出相应的User模型实例。
注意我们并没有在调用belongsTo的时候指定相应的外键信息,那么Eloquent模型底层是怎么判断User与UserAccount的对应关系的呢?
默认情况下,Eloquent将调用belongsTo的关联方法名user作为关联关系 relation的值,并将 relation.’_id’作为默认外键名对应users表的id,如果表中没有相应列,又没有在定义关联关系的时候指定具体的外键,就会报错。
那么又该如何在定义关联关系的时候指定外键呢?
实际上在底层无论是hasOne方法还是belongsTo方法都可以接收额外参数,比如如果user_accounts中关联users的外键是 foreignkey,该外键对应users