当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel5.1 框架模型一对一关系实现与使用方法实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-03 20:37:19 浏览: 评论:0 

本文实例讲述了Laravel5.1 框架模型一对一关系实现与使用方法,分享给大家供大家参考,具体如下:

这篇文章主要记录模型的一对一关系,关联关系是Model的一种非常方便的功能。

1 实现一对一关系

1.1 准备工作

首先我们需要创建两张表和对应的两个模型,第一个模型是用户表,第二个模型是账号表。

这里 我们的逻辑是:一个用户信息下只能有一个账号,一个账号只能被一个用户所拥有,这就是一对一关系。

1.1.1 用户信息表

生成模型和迁移文件:

php artisan make:model UserInfo -m

编写迁移文件(表规格):

  1. public function up() 
  2. { 
  3.   Schema::create('user_infos', function (Blueprint $table) { 
  4.     $table->increments('id'); 
  5.     $table->string('name'); 
  6.     $table->string('phone_number');     // 手机号 
  7.     $table->timestamps(); 
  8.   }); 
  9. } 

编写模型工厂:

  1. // user_info 
  2. $factory->define(App\UserInfo::class, function (Faker\Generator $faker) { 
  3.   return [ 
  4.     'name' => $faker->name, 
  5.     'phone_number' => $faker->phoneNumber, 
  6.   ]; 
  7. }); 

使用seeder:

php artisan make:seeder UserInfoSeeder

  1. public function run() 
  2. { 
  3.   factory(\App\UserInfo::class, 10)->create(); 
  4. } 
  5. public function run() 
  6. { 
  7.   Model::unguard(); 
  8.   $this->call('UserInfoSeeder'); 
  9.   Model::reguard(); 
  10. } 

生成数据并使用seeder填入数据:

php artisan migrate:seeder

1.1.2 账号表

编写迁移文件(表规格):

  1. public function up() 
  2. { 
  3.   Schema::create('accounts', function (Blueprint $table) { 
  4.     $table->increments('id'); 
  5.     $table->string('user_name');    // 用户名 
  6.     $table->integer('user_info_id');  // 关联键 
  7.     $table->timestamps(); 
  8.   }); 
  9. } 

2 编写关系

首先是账号表,在模型下编写以下代码:

  1. public function user() 
  2. { 
  3.   return $this->belongsTo(UserInfo::class, 'user_info_id', 'id'); 
  4. } 

代码解读:belongsTo的第二个和第三个参数是完全可以省略的。如果省略了第二个和第三个参数的话 Laravel根据方法名自动填充,会把第二个参数填充成 "user_id" 第三个参数填充 "id",但是我们现在必须这样写,因为我自定义的外键是user_info_id 如果Laravel自动填充的话是找不到这个外键的 所以我们要手动的添加下。

belongsTo的第二个参数是 Account这个模型要用'user_info_id'外键去关联UserInfo模型。

belongsTo的第三个参数是 Account这个模型要关联UserInfo的主键名。

然后是用户信息表:

  1. public function account() 
  2. { 
  3.   return $this->hasOne(Account::class); 
  4. } 

代码解读:hasOne的第二个和第三个参数也是完全可以省略的,如果省略了第二个和第三个参数的话 Laravel会自动填充,会把第二个参数填充成 "user_info_id" 第三个参数填充 "id"。

使用:

  1. //  $account = App\Account::find(1); 
  2. //  dd($account->user); 
  3.   $userInfo = App\UserInfo::find(1); 
  4.   dd($userInfo->account);

Tags: Laravel5.1一对一关系

分享到: