专栏首页程序员小助手3分钟短文:说说Laravel模型中还算常用的2个“关系”
原创

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 属性,返回的是一个 App\User 对象实例,其包含 User 模型的所有属性,

因此 email 属性也相应返回数据库内的字段值。

一对多关系

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

这都是一对多的常见用法。

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

php artisan make:model State --migration

默认在 App\State.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领域原创作者

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    关系型数据库提供了非常好用的数据关联绑定模式,使用SQL语句可以方便地进行关联数据查询和操作。

    程序员小助手
  • 3分钟短文:Laravel 从软删除说到模型作用域的概念

    上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要的一个方法, 就是数据的删除。删除数据,有物理删除和软删除的区别。

    程序员小助手
  • 3分钟短文 | Laravel 检验关联模型是否存在的2个必知必会方法

    接着我们的Laravel系列说下去。今天的主题是在程序内,用什么方法判断,模型的关联模型是否存在呢?

    程序员小助手
  • 深入理解Laravel定时任务调度机制

    一个复杂的web系统后台当中,一定会有很多定时脚本或者任务要跑。例如爬虫系统需要定期去爬取一些网站数据,自动还贷系统需要每个月定时对用户账户扣款结算,会员系统需...

    horstxu
  • 全局梳理、分析、总结 laravel 的核心概念

    Laravel 是 Taylor Otwell 开发的一款基于 PHP 语言的 Web 开源框架,采用了 MVC 的架构模式。

    八点半的Bruce、D
  • 如何在Ubuntu 14.04上使用Ansible部署高级PHP应用程序

    在本教程中,我们将介绍如何设置SSH密钥以支持代码部署/发布工具,配置系统防火墙,配置和配置数据库(包括密码!),以及设置任务调度程序(crons)和队列守护进...

    圣人惠好可爱
  • php之laravel项目中使用腾讯云短信

    进入该网址 :腾讯云短信控制台->  https://console.cloud.tencent.com/sms

    tengxunyun
  • Laravel框架关键技术解析

    1.index.php:自动加载函数的添加、服务容器实例化与服务注册、路由加载、请求实例化与路由分发、响应生成与发送

    硬核项目经理
  • 基于 Redis 实现简单限流器及其在路由中间件中的应用

    所谓限流器,指的是限制访问指定服务/路由的流量,通俗点说,就是限制单位时间内访问指定服务/路由的次数(频率),从系统架构角度看,通过限流器可以有效避免短时间内的...

    学院君

扫码关注云+社区

领取腾讯云代金券