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

简介: 史上最简单的“一对一”关系

引言

关系型数据库提供了非常好用的数据关联绑定模式,使用SQL语句可以方便地进行关联数据查询和操作。
如果所有关联关系放到数据库层面操作,势必非常不便。

img

所以,laravel模型提供了关联关系,本文就来梳理梳理那些用法。

代码时间

我们不要PPT似的念稿子,罗列出所有的关系模型,那样不直观也不是高效学习的方式。
还是从示例触发,看看关联关系到底解决的是什么问题,以及如何使用。

首先是数据库的准备,假设有如下两个表的字段对应关系:

pic

使用命令行创建一个Profile模型,并同时创建迁移文件:

php artisan make:model Profile --migration

来看生成的 app/Profile.php 文件的内容:

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关联删除。那么只要修改迁移文件,
并添加如下内容:

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

写在最后

本文介绍了laravel模型关联的最简单的“一对一”,我们从程序角度和数据库角度讲解了
如何在删除资源时的一致性删除。更复杂的关系,在编程层面是有意义的,我们下一章介绍更多的关联关系。

Happy coding :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

相关文章
|
15天前
|
机器学习/深度学习 数据处理
NeurIPS 2024:消除多对多问题,清华提出大规模细粒度视频片段标注新范式VERIFIED
清华大学研究团队提出VERIFIED,一种基于大型语言模型和多模态模型的大规模细粒度视频片段标注新方法。VERIFIED通过静态与动态增强字幕及细粒度感知噪声评估器,有效解决了视频语义理解中的多对多问题、细粒度理解和大规模数据标注挑战。实验结果显示,VERIFIED能生成高质量的细粒度视频片段标注,显著提升了视频理解的精度和效率。
38 2
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
|
自然语言处理 算法 编译器
C++基础句法
● 使用场景 1.switch只能支持常量固定值相等的判断 2.if还可以判断区间范围 3.用switch能做的,用if都能做,但是反过来不行。
86 0
|
机器学习/深度学习 存储 数据采集
【英文文本分类实战】之二——数据集挑选与划分
【英文文本分类实战】之二——数据集挑选与划分
317 0
【英文文本分类实战】之二——数据集挑选与划分
|
自然语言处理 知识图谱 容器
ACL2022 | 关系抽取和NER等论文分类整理
ACL2022 | 关系抽取和NER等论文分类整理
1385 0
ACL2022 | 关系抽取和NER等论文分类整理
|
测试技术 uml
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
325 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
|
测试技术 uml 数据安全/隐私保护
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
301 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
|
运维 测试技术 uml
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
417 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
|
机器学习/深度学习 存储 Oracle
AAAI2020 | SNERL:抛开mention级别的监督,实体链接、关系抽取我都行
AAAI2020 | SNERL:抛开mention级别的监督,实体链接、关系抽取我都行
204 0
AAAI2020 | SNERL:抛开mention级别的监督,实体链接、关系抽取我都行
|
机器学习/深度学习 人工智能 自然语言处理
潜心30年,知网知识系统如何从概念层次上计算自然语言
近日,机器之心采访了语知科技的首席科学家董强先生,董强向我们详细介绍了一种基于 Common-sense 知识库体系从概念层次进行自然语言处理的技术。语知自然语言理解技术平台正是基于知网语言知识库独有的语义分析技术,从概念层次上而不是从词的层面上进行自然语言处理,因此系统的计算复杂度会大大降低,也就更容易将系统离线部署到移动端或边缘设备中。深耕 30 多年 NLU 的知网(HowNet)如今正以语知科技创业公司的形象走进公众的视野。
265 0
潜心30年,知网知识系统如何从概念层次上计算自然语言