📜  laravel 关系 (1)

📅  最后修改于: 2023-12-03 14:43:46.855000             🧑  作者: Mango

Laravel 关系数据库

作为一款流行的 PHP 框架,Laravel 内置了自己的 ORM - Eloquent ORM,使得与关系型数据库(MySQL,PostgreSQL 等)进行交互变得容易。

模型定义

关系数据库的表在 Laravel 中可以通过定义 Eloquent 模型来表示。首先要创建一个和表对应的 Eloquent 模型后,在相应的模型文件中指定与数据库表关联的信息(表名、主键、时间戳等)。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 关联的数据表名
     * 
     * @var string
     */
    protected $table = 'users';

    /**
     * 主键名
     * 
     * @var string
     */
    protected $primaryKey = 'id';

    /**
     * 是否启用时间戳
     * 
     * @var bool
     */
    public $timestamps = true;

    // ...
}
关系映射

在定义模型时,Laravel 提供了多种方法来定义不同的关系映射。以下是其中一些类型的示例:

一对一
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // ...

    /**
     * 获取与用户关联的电话记录。
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

class Phone extends Model
{
    /**
     * 获取分配给电话的用户。
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}
一对多
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // ...

    /**
     * 获取帖子的评论。
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

class Comment extends Model
{
    /**
     * 获取发表此评论的用户。
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    /**
     * 获取此评论所属的帖子。
     */
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}
多对多
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    // ...

    /**
     * 获取拥有此角色的所有用户。
     */
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

class User extends Model
{
    /**
     * 获取分配给此用户的所有角色。
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}
查询构建器

查询构建器是 Eloquent 模型的核心。可以使用链式方法来定义多个查询条件,并获取查询结果。以下是一个简单的示例:

// 查找状态为 active 的所有用户
$users = App\User::where('status', 'active')->get();

除了 where 方法,Laravel 的查询构建器还提供了更多的条件链式方法,如 orWhere、whereIn、whereBetween 等等。

延迟的关系

有时可以将关系属性定义为延迟加载,以避免在加载模型时过多的查询。这可以通过在关系属性前加上 lazy:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // ...

    /**
     * 定义延迟加载关系
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role')->lazy();
    }
}

延迟关系可以在访问时加载:

// 读取用户角色时再加载
$user->load('roles');
总结

Laravel 的 Eloquent ORM 提供了方便的方式来与关系型数据库进行交互。借助模型定义与关系映射,程序员可以轻松地进行常用的 CRUD 操作。查询构建器提供适用于各种情况的灵活、强大的查询方法,简化了对复杂数据的查询处理。延迟加载关系可优化高负载场景下的访问性能。