📜  laavel 通过 morph 建立关系 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:32.265000             🧑  作者: Mango

Laravel 通过 Morph 建立关系 - PHP

Laravel 是一个非常流行的 PHP Web 开发框架,提供了丰富的数据库操作工具和 ORM(Object-Relational-Mapping)功能。其中,Morph 是一种非常方便的关系建立方式,可以让你的数据库设计更加灵活。

什么是 Morph

Morph 是 Laravel 的一个特殊关系建立方式,它允许不同模型建立一对多或多对多的关系,而不需要在数据库中使用外键。相反,Morph 是通过在模型之间使用一个通用的 ID 进行关联的。

Morph 实现多态关系

Morph 主要用于实现多态关系,即一个模型可以作为另一个模型的「所属者」,并且可以属于多个模型。比如,一个评论可以属于一篇文章、一个视频,或者一张图片。这个功能可以让你的数据表结构更加灵活,而且代码实现也更加直观。

Morph 实际应用

使用 Morph 首先需要在模型之间建立关系,Laravel 提供了 morphTomorphMany/morphToMany 两个方法来实现,这两个方法都是在 Eloquent 模型中定义的。

下面是一个实际应用的例子:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    /**
     * Get all of the owning commentable models.
     */
    public function commentable()
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    /**
     * Get all of the post's comments.
     */
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

class Video extends Model
{
    /**
     * Get all of the video's comments.
     */
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

上面代码中,Comment 模型通过 morphTo() 方法定义了「所属者」,而 PostVideo 模型通过 morphMany() 方法分别定义了自己的评论。这时候,如果想要获取某个模型的评论,可以直接通过 comments 属性来获取:

$post = Post::find(1);

$comments = $post->comments;
总结

Morph 是 Laravel 中一种非常方便的关系建立方式,它提供了一种不用在数据库中使用外键的设计思路,让数据库结构更加灵活。实际应用中,我们一般用它来实现多态关系,比如一个评论可以属于多种不同类型的模型。Morph 提供了 morphTo()morphMany/morphToMany 两个方法,我们可以在 Eloquent 模型中使用这两个方法来建立关系。