Sobes.tech
Middle

Ինչպես իրականացնում են կապի տեսակները Laravel-ում?

sobes.tech AI

Պատասխան AI-ից

Լարավելում մոդելների միջև կապերի (հարաբերությունների) տեսակները իրականացնում են համապատասխան մոդելներում սահմանված մեթոդների միջոցով։ Այս մեթոդները վերադարձնում են հատուկ դասերի օբյեկտներ, որոնք նկարագրում են կապի տեսակը։

Հիմնական կապերի տեսակները և դրանց մեթոդները՝

  1. Միայն մեկին (One-to-One)

    • hasOne(): Օգտագործվում է այն մոդելում, որը "պատկանում" է կապին (օր., User ունի Phone
    • belongsTo(): Օգտագործվում է այն մոդելում, որը "նպատկանում" է մյուս մոդելին (օր., Phone պատկանում է User
  2. Միայն շատ (One-to-Many)

    • hasMany(): Օգտագործվում է այն մոդելում, որը կարող է ունենալ շատ կապված մոդելներ (օր., User ունի շատ Post
    • belongsTo(): Օգտագործվում է այն մոդելում, որը պատկանում է շատ կապված մոդելների (օր., Post պատկանում է User
  3. Շատ-շատ (Many-to-Many)

    • belongsToMany(): Օգտագործվում է երկու կողմերից՝ միջնորդական աղյուսակով։ Օր., Post ունի շատ Tag, և Tag ունի շատ Post, միջնորդական աղյուսակով post_tag։
  4. Միայն մեկին (պոլիմորֆիկ) (One-to-One Polymorphic)

    • morphOne(): Օգտագործվում է մոդելում, որը կարող է պատկանել տարբեր տեսակի կապված մոդելներ (օր., Post կամ User ունեն Image
    • morphTo(): Օգտագործվում է պոլիմորֆիկ կապված մոդելում (Image), որպեսզի որոշի՝ որ մոդելին է պատկանում (Post կամ User
  5. Միայն շատ (պոլիմորֆիկ) (One-to-Many Polymorphic)

    • morphMany(): Օգտագործվում է մոդելում, որը կարող է ունենալ շատ կապված մոդելներ տարբեր տիպերի (օր., Post կամ Comment ունեն շատ Image
    • morphTo(): Օգտագործվում է պոլիմորֆիկ կապված մոդելում (Image), որպեսզի որոշի՝ որ մոդելին է պատկանում (Post կամ Comment
  6. Շատ-շատ (պոլիմորֆիկ) (Many-to-Many Polymorphic)

    • morphToMany(): Օգտագործվում է երկու կողմերից՝ պոլիմորֆիկ աղյուսակով։ Օր., Post կամ Video կարող է ունենալ շատ Tag, կապված taggables աղյուսակով։
    • morphedByMany(): Օգտագործվում է կապված մոդելում (Tag), որպեսզի որոշի՝ որ տիպերի մոդելների հետ կարող է կապվել (Post կամ Video

Նմուշ՝ hasMany և belongsTo մեթոդների իրականացման:

<?php

// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    /**
     * Ստանում է օգտագործողի գրառումները։
     */
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
<?php

// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Post extends Model
{
    /**
     * Ստանում է օգտատիրոջը, որը պատկանում է գրառմանը։
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

Լարավելը ավտոմատ ենթադրում է արտաքին կոդերի անունները և կապված աղյուսակների անունները՝ հիմնվելով մոդելների անունների վրա։ Այս ենթադրությունները կարելի է վերագրել՝ փոխանցելով լրացուցիչ արգումենտներ հարաբերությունների մեթոդներին։ Օր., hasMany(Post::class, 'author_id') նշում է, որ արտաքին կոդը posts աղյուսակում կոչվում է author_id։