3分钟短文:说说Laravel模型中还算常用的2个“关系”

简介: 只说简单的,不说复杂的

引言

上一章我们介绍了比较简单的laravel模型关联关系中的一对一,介绍了关联操作方法。
太难的概念理解起来都费劲,更不用说写代码了,所以对于太难的那些关联关系,
且不论其效率如何,我们都不先做介绍。

img

本期说一说2个比较常用的关联模型。

belongsTo 关系

正好像对于一个词语,找到对应的反义词,或者说有一个图片,找到其镜像图片这样的。
有作用力,就有反作用力。一对一关系模型中,A有一个B,则反过来,B属于一个A。
这就是首先要介绍的 belongsTo 关系。

在模型Profile中添加对应到User模型的关系:

class Profile extends Model {
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

也就是说,有一个profile是从属于user的,这与User模型的hasOne正好是对应关系。
在代码中使用该关联关系:

$email = Profile::where('id', 3)->first()->user->email;

其中first方法返回一个Profile模型对象实例,在Profile类中我们声明了 user() 方法用于关系用户模型,
所以此处链式调用 user 属性,返回的是一个 AppUser 对象实例,其包含 User 模型的所有属性,
因此 email 属性也相应返回数据库内的字段值。

一对多关系

还有一个常见的关联关系是一对多。比如一个用户有多个手机号,一种状态包含很多个事件,一个商品有多个标签等等等等,
这都是一对多的常见用法。

我们使用State模型状态有多个Event事件这个场景,演示一下一对多关系的声明,以及应用。在命令行创建模型文件,同时创建迁移文件:

php artisan make:model State --migration

默认在 AppState.php 文件内生成下面的代码:

use Illuminate\Database\Eloquent\Model;
class State extends Model {}

我们还是先去生成数据库表的迁移文件,手动实现迁移字段:

public function up()
{
    Schema::create('states', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');
        $table->string('abbreviation');
        $table->timestamps();
    });
}

以及撤回迁移时删除表:

public function down()
{
    Schema::drop('states');
}

接着在命令行执行迁移指令:

php artisan migrate

执行成功,数据库表states就创建成功了。

我们说关联关系需要外键,所以需要手动在events表内追加一个字段 state_id,用于指向刚才创建的表states的id字段。
执行命令行,创建迁移文件:

php artisan make:migration add_state_id_to_events_table --table=events

手动实现迁移文件的修改:

public function up()
{
    Schema::table('events', function (Blueprint $table) {
        $table->integer('state_id')->unsigned()->nullable();
        $table->foreign('state_id')->references('id')->on('states');
    });
}

以及回滚迁移时手动删除追加的字段:

public function down()
{
    Schema::table('events', function (Blueprint $table) {
        $table->dropForeign('events_state_id_foreign');
        $table->dropColumn('state_id');
    });
}

基础数据准备完毕,下面在模型内添加关联关系:

class State extends Model {
    public function events() {
        return $this->hasMany('App\Event');
    }
}

非常直观,一种状态,有若干个事件。反过来,一个事件,一定属于某种状态,那就是belongsTo关系。

class Event extends Model {
    public function state()
    {
        return $this->belongsTo('App\State');
    }
}

代码层面也准备好了,下面可以开始使用了。比如创建事件时,手动为其指定状态:

$event = new Event;
$event->name = "Laravel Hacking and Pizza";
$event->state_id = 41;
$event->save();

注意,hasMany关联关系,返回的是多个模型的集合,可以后续链式调用集合的所有方法。

写在最后

本文不失简单地介绍了belongsTo和hasMany两个关联关系,这在代码中仅次于hasOne关系,
使用的频次比较高的。而效率也就是根据外键多查询一次SQL的消耗而已。但是明白其中原理之后,
在代码内耗时的操作里,也绝不可滥用关联关系,否则会严重消耗性能。

Happy coding :-)

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

相关文章
|
1月前
|
机器学习/深度学习 存储 算法
Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系
通过探索大语言模型(LLM)架构之间的潜在联系,我们可能开辟新途径,促进不同模型间的知识交流并提高整体效率。尽管Transformer仍是主流,但Mamba等线性循环神经网络(RNN)和状态空间模型(SSM)展现出巨大潜力。近期研究揭示了Transformer、RNN、SSM和矩阵混合器之间的深层联系,为跨架构的思想迁移提供了可能。本文深入探讨了这些架构间的相似性和差异,包括Transformer与RNN的关系、状态空间模型在自注意力机制中的隐含作用以及Mamba在特定条件下的重写方式。
66 7
Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系
|
3月前
|
存储 人工智能 NoSQL
拆解LangChain的大模型记忆方案
之前我们聊过如何使用LangChain给LLM(大模型)装上记忆,里面提到对话链ConversationChain和MessagesPlaceholder,可以简化安装记忆的流程。下文来拆解基于LangChain的大模型记忆方案。
拆解LangChain的大模型记忆方案
|
5月前
|
自然语言处理 知识图谱
【笔记】探索生成范式:大型语言模型在信息提取中的作用
【笔记】探索生成范式:大型语言模型在信息提取中的作用
136 7
|
5月前
|
存储 人工智能 数据库
【AI大模型应用开发】【LangChain系列】2. 一文全览LangChain数据连接模块:从文档加载到向量检索RAG,理论+实战+细节
【AI大模型应用开发】【LangChain系列】2. 一文全览LangChain数据连接模块:从文档加载到向量检索RAG,理论+实战+细节
225 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
【论文精读】AAAI 2022- 统一的命名实体识别作为词与词之间的关系分类
|
5月前
|
自然语言处理 Python
BERT模型基本理念、工作原理、配置讲解(图文解释)
BERT模型基本理念、工作原理、配置讲解(图文解释)
728 0
|
定位技术
定义系统、模型、结构等概念|认知建模笔记翻译(4)
定义系统、模型、结构等概念|认知建模笔记翻译(4)
114 0
语音识别(ASR)基础介绍第三篇——经典做法及术语概念
上一章介绍了万金油特征MFCC,相当于数据的输入已经确定了。 本章尽可能的介绍经典asr做法。其中涉及到的各种概念和思考,了解了之后,和相关专业的人交流,大概就不再迷茫了:D 传统方法也可以按 声学模型 和 语言学模型 的方式来划分。 声学模型主要的职责是,把一段音频处理成类似拼音的形式, 然后交给语言模型来猜: 能够发这些音的单词,怎么组合起来更常见一些。然后找到最可能的组合,便是asr的结
6432 0
|
机器学习/深度学习 人工智能 自然语言处理
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
263 0
|
机器学习/深度学习 并行计算 算法
像Transformer一样思考!DeepMind发布全新模型设计工具Tracr:从可解释逻辑反向搭建模型
像Transformer一样思考!DeepMind发布全新模型设计工具Tracr:从可解释逻辑反向搭建模型
191 0