Ինչպես իրականացնում են կապի տեսակները Laravel-ում?
sobes.tech AI
Պատասխան AI-ից
Լարավելում մոդելների միջև կապերի (հարաբերությունների) տեսակները իրականացնում են համապատասխան մոդելներում սահմանված մեթոդների միջոցով։ Այս մեթոդները վերադարձնում են հատուկ դասերի օբյեկտներ, որոնք նկարագրում են կապի տեսակը։
Հիմնական կապերի տեսակները և դրանց մեթոդները՝
-
Միայն մեկին (One-to-One)
hasOne(): Օգտագործվում է այն մոդելում, որը "պատկանում" է կապին (օր.,UserունիPhone)։belongsTo(): Օգտագործվում է այն մոդելում, որը "նպատկանում" է մյուս մոդելին (օր.,Phoneպատկանում էUser)։
-
Միայն շատ (One-to-Many)
hasMany(): Օգտագործվում է այն մոդելում, որը կարող է ունենալ շատ կապված մոդելներ (օր.,Userունի շատPost)։belongsTo(): Օգտագործվում է այն մոդելում, որը պատկանում է շատ կապված մոդելների (օր.,Postպատկանում էUser)։
-
Շատ-շատ (Many-to-Many)
belongsToMany(): Օգտագործվում է երկու կողմերից՝ միջնորդական աղյուսակով։ Օր.,Postունի շատTag, ևTagունի շատPost, միջնորդական աղյուսակովpost_tag։
-
Միայն մեկին (պոլիմորֆիկ) (One-to-One Polymorphic)
morphOne(): Օգտագործվում է մոդելում, որը կարող է պատկանել տարբեր տեսակի կապված մոդելներ (օր.,PostկամUserունենImage)։morphTo(): Օգտագործվում է պոլիմորֆիկ կապված մոդելում (Image), որպեսզի որոշի՝ որ մոդելին է պատկանում (PostկամUser)։
-
Միայն շատ (պոլիմորֆիկ) (One-to-Many Polymorphic)
morphMany(): Օգտագործվում է մոդելում, որը կարող է ունենալ շատ կապված մոդելներ տարբեր տիպերի (օր.,PostկամCommentունեն շատImage)։morphTo(): Օգտագործվում է պոլիմորֆիկ կապված մոդելում (Image), որպեսզի որոշի՝ որ մոդելին է պատկանում (PostկամComment)։
-
Շատ-շատ (պոլիմորֆիկ) (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։