3分钟短文:说说Laravel模型关联关系最单纯的“一对一”

引言关系型数据库提供了非常好用的数据关联绑定模式 , 使用SQL语句可以方便地进行关联数据查询和操作 。如果所有关联关系放到数据库层面操作 , 势必非常不便 。
3分钟短文:说说Laravel模型关联关系最单纯的“一对一”文章插图
所以 , laravel模型提供了关联关系 , 本文就来梳理梳理那些用法 。
代码时间我们不要PPT似的念稿子 , 罗列出所有的关系模型 , 那样不直观也不是高效学习的方式 。还是从示例触发 , 看看关联关系到底解决的是什么问题 , 以及如何使用 。
首先是数据库的准备 , 假设有如下两个表的字段对应关系:
3分钟短文:说说Laravel模型关联关系最单纯的“一对一”文章插图
使用命令行创建一个Profile模型 , 并同时创建迁移文件:
php artisan make:model Profile --migration来看生成的 app/Profile.php 文件的内容:
【3分钟短文:说说Laravel模型关联关系最单纯的“一对一”】namespace App;use Illuminate\Database\Eloquent\Model;class Profile extends Model {}因为使用了 --migration 选项 , laravel自动生成了 database/migrations/2020_10_11_015236_create_profiles_table.php 文件 ,用于生成对应的数据库 profiles 表 。
还是老规矩 , 先实现数据库迁移使用的 up 方法:
public function up(){Schema::create('profiles', function(Blueprint $table){$table->increments('id');$table->integer('user_id')->unsigned();$table->foreign('user_id')->references('id')->on('users');$table->string('url');$table->string('telephone');$table->timestamps();});}用于回滚的方法就不列出来了 , 仅仅是表的删除 。 下面手动执行迁移指令:
php artisan migrate输出内容如下:
Migrated: 2020_10_11_015236_create_profiles_table.php关联关系一切准备就绪 , 我们开始使用关联关系来处理数据的一致性 。 一个user对应一个profile , 所以这是一对一的关系 ,在User模型里添加如下声明:
class User extends Model {public function profile(){return $this->hasOne('App\Profile');}}一旦定义了上述方法 , 就可以这样链式调用了:
$user = User::find(1)->profile->telephone;我们拆解开做解释 。 首先使用 User::find($id) 返回的是一个 User 模型对象的实例 。该实例有一个 profile 方法 , 就是上面这段关系声明 。
调用 profile 返回的是一个 Profile 对象的实例 , 所以可以继续调用Profile的属性 , 也就是 telephone 的由来了 。
需要特别注意的是 , 类似下面的写法 , 返回结果是不同的:
$user = User::find($id);$user->profile; // 返回 Profile 对象$user->profile(); // 返回 hasOne 关联关系对象大家在使用的时候 , 一定不要迷惑 , 要分清楚使用方法 。
有了关联查询 , 自然就有关联更新 , 用法如下:
$profile = new Profile;$profile->telephone = '12345678';$user = User::find(1);$user->profile()->save($profile);有了关联更新这种写操作 , 自然就有了关联删除 , 模型方法的调用而已:
$user = User::find($id);$user->profile()->delete();由于是严格一对一的关系 , 也就是一个user只有一个profile , 如果某个user被删除了 ,就会剩下一个孤零零的profile无所依附 。
除了在程序上下文的一致性保证外 , 还可以使用数据库的外键 , 在删除user时将profile关联删除 。 那么只要修改迁移文件 ,并添加如下内容:


推荐阅读