通过实例学习Laravel模型中的一对一关联关系
一、前言
Laravel遵循【约定优于配置】的原则。PHP开发者只需要遵循Laravel框架的原则,就能减少大量的工作,这便是Laravel的魅力之一。下面是我的笔记,将用Laravel中的模型关系一步一步探索Laravel框架的魅力。
框架版本:Laravel7
数据表:使用Laravel开箱自带的users表
使用到的数据表:users表与user_profiles表
- users表:用户表
- user_profiles:用户属性信息表
二、创建控制器、模型、数据库
步骤一:创建UserProfile模型与迁移文件
php artisan make:model UserProfile -m
// 文件位置
// app/UserProfile.php # 模型文件位置
// app/database/migrations/2020_06_15_122534_create_user_profiles_table.php
步骤二:编写user_profiles迁移文件并创建表
public function up()
{
Schema::create('user_profiles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->default(0)->unique();
$table->string('bio')->nullable()->comment('个性签名');
$table->string('city')->nullable()->comment('所在城市');
$table->json('hobby')->nullable()->comment('个人爱好');
$table->timestamps();
});
}
步骤三:运行迁移文件
php artisan migrate
步骤四:填充数据(略)。请自行填充数据
三、定义路由
Route::get('test01' , 'Home\IndexController@test01');
四、创建控制器
php artisan make:controller Home/IndexController
五、使用一对一模型关联(重点)
1)理解:一个用户对应着一个属于自己的属性信息表。换个例子来说,一个男人只有能有一个合法妻子; 如:users用户表存 姓名、手机、性别,user_profiles表存用户的爱好、身高等信息,这两个表之间的关联关系是用users表中的id与user_profiles表中user_id关联; 2)Laravel使用hasOne()方法使用获取自己的属性信息,条件如下:
return $this->hasOne($className,$foreignKey=null,$localKey=null);
参数一:要关联的模型类名。 这里指 UserProfile模型
参数二:要关联模型所属表中的外键。 这里指 user_profiles表中的user_id
参数三:关联表的外键。 这里指 users表中的id
hasOne要关联模型名所对应表的外键与关联表的主键关键
3)belongsTos相对关联,条件如下:
return $this->belongsTo(className,$foreignKey=null,$ownerKey=null);
参数一:要关联的模型类名。 这里指 User模型
参数二:当前模型类所属表中的外键。 这里指 user_profiles表中的user_id
参数三:关联模型所属表主键。 这里指 users表中的id
5.1、使用用户获取对应的用户属性信息
步骤一:App/User.php模型中定义hasOne方法
// app/user.php
<?php
namespace App;
// 推荐写法
public function profile()
{
// 获取用户属性信息
return $this->hasOne(UserProfile::class,'user_id','id');
}
// 不推荐此写法
public function profile1()
{
return $this->hasOne(UserProfile::class);
}
}
步骤二:控制器调用
// app/Http/Controllers/Home/indexController.php
<?php
namespace App\Http\Controllers\Home;
use App\Http\Controllers\Controller;
use App\User;
use App\UserProfile;
class IndexController extends Controller
{
public function test01()
{
$user = User::find(1);
dd($user->profile);
}
}
5.1、belongsTo通过用户属性信息获取用户信息
步骤一:App/UserProfile.php模型中定义belongsTo方法
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserProfile extends Model
{
// 推荐写法
public function user()
{
// 获取用户信息
return $this->belongsTo(User::class,'user_id','id');
}
// 不推荐此写法
public function user1()
{
return $this->belongsTo(User::class);
}
}
注意:这里是通过动过属性来获取对应的数据,也就是,把模型中定义的关联方法通过动态属性来调用。
请登录后再评论