了解 Laravel 模型中的自我關係:簡單指南

Mary-Kate Olsen
發布: 2024-09-24 20:16:36
原創
487 人瀏覽過

Understanding Self-Relationships in Laravel Models: A Simple Guide

Laravel では、接続されたデータを整理して操作するには、モデル間の関係が不可欠です。通常、User モデルと Post モデルの間など、異なるモデル 間の関係を定義します (たとえば、ユーザーは多数の投稿を持つことができます)。ただし、場合によっては、モデルがそれ自体に関連付けられる関係を作成する必要があります。これは、自己参照関係 または 自己関係 と呼ばれます。

ここで、このような関係が必要な理由を、実際の簡単な例とコード スニペットを使用して説明しましょう。


1. 自己関係とは何ですか?

自己関係は、オブジェクトが同じ種類の別のオブジェクトに関連付けられるときに発生します。各従業員にマネージャーがいる組織を管理していると想像してください。しかし、マネージャーも従業員です!この場合、従業員を他の従業員に接続する必要があります。これは、同じモデルのインスタンス間の関係を作成することを意味します。

現実世界の例: 従業員とマネージャー

  • 従業員には、従業員でもあるマネージャーがいる場合があります。
  • この関係は、従業員が別の従業員 (上司) に「​​属する」ことができると同時に、他の従業員 (部下) を「持つ」ことができることを意味します。

2. なぜ自己関係が必要なのでしょうか?

セルフリレーションシップは、データが同じタイプの他のデータを参照する必要がある状況で役立ちます。一般的なシナリオには次のようなものがあります。

  • 従業員階層: 従業員は、同じく従業員であるマネージャーに直属します。
  • カテゴリ: カテゴリにはサブカテゴリがある場合があります。たとえば、「プログラミング」カテゴリには、「Web 開発」や「データ サイエンス」などのサブカテゴリが含まれる場合があります。
  • 友達: ソーシャル ネットワークでは、ユーザーには同じユーザーである友達がいる場合があります。

3. コード例: 従業員とマネージャーの関係

従業員とマネージャーという一般的な例を使用して、コードに分解してみましょう。

ステップ 1: 従業員モデルの作成と移行

まず、従業員のモデルが必要です。 Laravel では、テーブル構造を定義するために、移行を使用してこれを作成します。

php artisan make:model Employee -m
登入後複製

このコマンドは、従業員モデルとそれに対応する移行ファイルの両方を作成します。

ステップ 2: 移行を定義する

次に、テーブル構造を定義します。ここでは、従業員の詳細の列と、従業員のマネージャー (従業員でもある) の ID を保存する列 (manager_id) が必要になります。

移行ファイル (例: 2024_09_24_000000_create_employees_table.php) で、次のような構造を定義します。

Schema::create('employees', function (Blueprint $table) {
    $table->id(); // Employee ID
    $table->string('name'); // Employee name
    $table->foreignId('manager_id')->nullable()->constrained('employees'); // Self-referencing
    $table->timestamps();
});
登入後複製
  • manager_id フィールドは、同じ 従業員テーブルの ID を指す外部キーです。これが私たちが自己言及関係を築く方法です。
  • 一部の従業員にはマネージャー (CEO など) がいない可能性があるため、NULL 可能です。

移行を実行してテーブルを作成します:

php artisan migrate
登入後複製

ステップ 3: 従業員モデルにおける自己関係を定義する

次に、Employee モデル自体内の関係を定義します。

Employee.php モデル ファイル内:

class Employee extends Model
{
    protected $fillable = ['name', 'manager_id'];

    // An employee belongs to a manager (who is also an employee)
    public function manager()
    {
        return $this->belongsTo(Employee::class, 'manager_id');
    }

    // An employee can have many subordinates (other employees)
    public function subordinates()
    {
        return $this->hasMany(Employee::class, 'manager_id');
    }
}
登入後複製

私たちがやったことは次のとおりです:

  • manager(): このメソッドは、従業員がマネージャーに属していることを定義します。
  • 部下(): このメソッドは、従業員が多くの部下を持つことができることを定義します。

4. コードでの使用例

それでは、これらの関係を実際にどのように使用できるかを見てみましょう。

従業員を追加

アリス (CEO)、ボブ (マネージャー)、チャーリー (ボブの直属の従業員) という 3 人の従業員がいるとします。

次のように追加できます:

// Creating Alice (CEO, no manager)
$alice = Employee::create(['name' => 'Alice']);

// Creating Bob, who reports to Alice
$bob = Employee::create(['name' => 'Bob', 'manager_id' => $alice->id]);

// Creating Charlie, who reports to Bob
$charlie = Employee::create(['name' => 'Charlie', 'manager_id' => $bob->id]);
登入後複製

関係を問い合わせる

  1. ボブのマネージャーを入手:
$bob = Employee::where('name', 'Bob')->first();
echo $bob->manager->name; // Outputs "Alice"
登入後複製
  1. アリスの部下を入手:
$alice = Employee::where('name', 'Alice')->first();
foreach ($alice->subordinates as $subordinate) {
    echo $subordinate->name; // Outputs "Bob"
}
登入後複製
  1. ボブの部下を入手:
$bob = Employee::where('name', 'Bob')->first();
foreach ($bob->subordinates as $subordinate) {
    echo $subordinate->name; // Outputs "Charlie"
}
登入後複製

5. 自己関係の実践的な使用例

カテゴリとサブカテゴリ

もう 1 つの例は、カテゴリとサブカテゴリです。各カテゴリにサブカテゴリを含めることができる、自己参照のカテゴリ モデルを作成できます。

class Category extends Model
{
    public function parentCategory()
    {
        return $this->belongsTo(Category::class, 'parent_id');
    }

    public function subCategories()
    {
        return $this->hasMany(Category::class, 'parent_id');
    }
}
登入後複製

これにより、次のようなカテゴリがネストされたシステムをモデル化できます。

  • エレクトロニクス
    • ラップトップ
    • スマートフォン

従業員の例と同様の方法で、親カテゴリとサブカテゴリをクエリできます。

Social Networks: Friends

In a social networking app, users might have other users as friends. You can model this with a self-relationship on the User model.

class User extends Model
{
    public function friends()
    {
        return $this->belongsToMany(User::class, 'user_friend', 'user_id', 'friend_id');
    }
}
登入後複製

This allows each user to have a list of friends who are also users.


Conclusion

Self-referential relationships are a powerful feature in Laravel for situations where data is related to other data of the same type. Whether you're modeling employee-manager hierarchies, category-subcategory structures, or friendships, self-relationships allow you to handle these kinds of relationships cleanly and efficiently.

By creating relationships to the same model, you can keep your data organized and easily query hierarchical or connected information with a few simple lines of code. Whether you're building an organizational chart, a category tree, or a social network, self-relationships in Laravel provide the flexibility you need.

以上是了解 Laravel 模型中的自我關係:簡單指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!