खोज…
रिश्तों पर सवाल करना
स्पष्ट रूप से आपको परिभाषित रिश्तों पर क्वेरी करने की सुविधा मिलती है, जैसा कि नीचे दिखाया गया है:
User::whereHas('articles', function (Builder $query) {
$query->where('published', '!=', true);
})->get();
इसके लिए आवश्यक है कि आपके संबंध विधि का नाम इस मामले में articles
हो। क्लोजर में दिया गया तर्क संबंधित मॉडल के लिए क्वेरी बिल्डर है, इसलिए आप यहां किसी भी प्रश्न का उपयोग कर सकते हैं जो आप कहीं और कर सकते हैं।
उत्सुक लोड हो रहा है
मान लें कि उपयोगकर्ता मॉडल का अनुच्छेद मॉडल के साथ संबंध है और आप संबंधित लेखों को उत्सुकता से लोड करना चाहते हैं। इसका अर्थ है कि उपयोगकर्ता के लेख उपयोगकर्ता को पुनर्प्राप्त करते समय लोड किए जाएंगे।
articles
उपयोगकर्ता मॉडल में संबंध नाम (विधि) है।
User::with('articles')->get();
यदि आपके पास कई संबंध हैं। उदाहरण के लिए लेख और पोस्ट।
User::with('articles','posts')->get();
और नेस्टेड रिश्तों का चयन करने के लिए
User::with('posts.comments')->get();
एक से अधिक नेस्टेड रिश्ते को कॉल करें
User::with('posts.comments.likes')->get()
संबंधित मॉडल सम्मिलित करना
मान लीजिए कि आपके पास Comment
साथ एक hasMany
संबंध के साथ एक Post
मॉडल है। आप निम्नलिखित करके एक पोस्ट से संबंधित Comment
ऑब्जेक्ट डाल सकते हैं:
$post = Post::find(1);
$commentToAdd = new Comment(['message' => 'This is a comment.']);
$post->comments()->save($commentToAdd);
आप कई मॉडल को एक बार saveMany
फ़ंक्शन का उपयोग करके सहेज सकते हैं:
$post = Post::find(1);
$post->comments()->saveMany([
new Comment(['message' => 'This a new comment']),
new Comment(['message' => 'Me too!']),
new Comment(['message' => 'Eloquent is awesome!'])
]);
वैकल्पिक रूप से, वहाँ भी एक है create
विधि है जो सुवक्ता मॉडल उदाहरण के बजाय एक सादे पीएचपी सरणी स्वीकार करता है।
$post = Post::find(1);
$post->comments()->create([
'message' => 'This is a new comment message'
]);
परिचय
वाक् संबंधों को आपके एलोकेंट मॉडल कक्षाओं के कार्यों के रूप में परिभाषित किया गया है। चूंकि, स्वयं एलक्विंट मॉडल की तरह, रिश्ते भी शक्तिशाली क्वेरी बिल्डरों के रूप में कार्य करते हैं, इसलिए रिश्तों को परिभाषित करना फ़ंक्शन के रूप में शक्तिशाली पद्धति को प्रदान करता है और क्षमताओं को क्वेरी करता है। उदाहरण के लिए, हम इस पोस्ट रिश्ते पर अतिरिक्त बाधाओं की श्रृंखला कर सकते हैं:
$user->posts()->where('active', 1)->get();
संबंध प्रकार
अनेको के लिये एक
कहते हैं कि प्रत्येक पोस्ट में एक या कई टिप्पणियां हो सकती हैं और प्रत्येक टिप्पणी सिर्फ एक पोस्ट की है।
इसलिए टिप्पणी तालिका post_id
हो रही है। इस मामले में रिश्ते इस प्रकार होंगे।
पोस्ट मॉडल
public function comments()
{
return $this->belongsTo(Post::class);
}
यदि विदेशी कुंजी post_id
, तो उदाहरण के लिए विदेशी कुंजी example_post_id
।
public function comments()
{
return $this->belongsTo(Post::class, 'example_post_id');
}
और इसके अलावा, अगर स्थानीय कुंजी id
से इतर है, उदाहरण के लिए स्थानीय कुंजी other_id
public function comments()
{
return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}
टिप्पणी मॉडल
एक के विलोम को परिभाषित करना
public function post()
{
return $this->hasMany(Comment::class);
}
एक से एक
दो मॉडलों के बीच कैसे संबंध स्थापित करें (उदाहरण: User
और Phone
मॉडल)
App\User
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the phone record associated with the user.
*/
public function phone()
{
return $this->hasOne('Phone::class', 'foreign_key', 'local_key');
}
}
App\Phone
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
/**
* Get the user that owns the phone.
*/
public function user()
{
return $this->belongsTo('User::class', 'foreign_key', 'local_key');
}
}
foreign_key
: डिफ़ॉल्ट रूप से एलोकेंट इस मान को other_model_name_id
(इस मामले में user_id
और phone_id
) phone_id
, यदि यह मामला नहीं है तो इसे बदल दें।
local_key
: डिफ़ॉल्ट रूप से local_key
इस मान को id
(वर्तमान मॉडल प्राथमिक कुंजी) मान लेगा, यदि यह मामला नहीं है तो इसे बदल दें।
यदि आपके डेटाबेस ने लार्वा मानक के अनुसार नाम दर्ज किया है, तो आपको रिश्ते की घोषणा में विदेशी कुंजी और स्थानीय कुंजी प्रदान करने की आवश्यकता नहीं है
व्याख्या
कई कई
कहते हैं कि भूमिकाएँ और अनुमतियां हैं। प्रत्येक भूमिका कई अनुमतियों की हो सकती है और प्रत्येक अनुमति कई भूमिका की हो सकती है। इसलिए 3 टेबल होंगे। दो मॉडल और एक धुरी तालिका। एक roles
, users
और permission_role
तालिका।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class);
}
नोट 1
धुरी तालिका के लिए अलग तालिका नाम का उपयोग करते समय निम्नलिखित पर विचार करें।
आप उपयोग करना चाहते हैं मान लीजिए role_permission
के बजाय permission_role
, धुरी कुंजी नाम के निर्माण के लिए वाक्पटु का उपयोग करता है के रूप में वर्णमाला क्रम। आपको निम्न के रूप में दूसरे पैरामीटर के रूप में पिवट टेबल नाम पारित करना होगा।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission');
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission');
}
नोट 2
धुरी तालिका में विभिन्न प्रमुख नामों का उपयोग करते समय निम्नलिखित पर विचार करें।
एलोकेंट मानता है कि यदि कोई कुंजी तीसरे और चौथे पैरामीटर के रूप में पारित नहीं होती है तो यह _id
साथ एकवचन तालिका नाम होगा। तो यह मानता है कि धुरी होने दिया जाएगा role_id
और permission_id
क्षेत्रों। यदि इनके अलावा अन्य कुंजियों का उपयोग किया जाना है तो इसे तीसरे और चौथे मापदंडों के रूप में पारित किया जाना चाहिए।
अगर कहते हैं कि चलो other_role_id
बजाय role_id
और other_permission_id
के बजाय permission_id
इस्तेमाल किया जा रहा है। तो यह इस प्रकार होगा।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}
बहुरूपी
बहुरूपी संबंध एक मॉडल को एक एकल संघ पर एक से अधिक अन्य मॉडल से संबंधित होने की अनुमति देता है। एक अच्छा उदाहरण चित्र होगा, एक उपयोगकर्ता और एक उत्पाद दोनों में एक छवि हो सकती है। तालिका संरचना निम्नानुसार दिख सकती है:
user
id - integer
name - string
email - string
product
id - integer
title - string
SKU - string
image
id - integer
url - string
imageable_id - integer
imageable_type - string
देखने के लिए महत्वपूर्ण स्तंभ चित्र तालिका में हैं। imageable_id
कॉलम में उपयोगकर्ता या उत्पाद का आईडी मूल्य होगा, जबकि imageable_type
करने imageable_type
कॉलम में मालिक मॉडल का वर्ग नाम होगा। अपने मॉडल में, आप संबंधों को निम्नानुसार सेट करते हैं:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
/**
* Get all of the owning imageable models.
*/
public function imageable()
{
return $this->morphTo();
}
}
class User extends Model
{
/**
* Get all of the user's images.
*/
public function images()
{
return $this->morphMany('Image::class', 'imageable');
}
}
class Product extends Model
{
/**
* Get all of the product's images.
*/
public function images()
{
return $this->morphMany('Image::class', 'imageable');
}
}
आप पॉलीमॉर्फिक मॉडल से पॉलीमॉर्फिक मॉडल के मालिक को उस तरीके के नाम तक morphTo
लिए भी प्राप्त कर सकते हैं जो morphTo
को कॉल करता है। हमारे मामले में, वह इमेज मॉडल पर imageable
करने योग्य तरीका है। इसलिए, हम उस पद्धति को एक गतिशील संपत्ति के रूप में एक्सेस करेंगे
$image = App\Image::find(1);
$imageable = $image->imageable;
यह imageable
या तो उपयोगकर्ता या उत्पाद वापस आ जाएगा।
कई कई
कहते हैं कि भूमिकाएँ और अनुमतियां हैं। प्रत्येक भूमिका कई अनुमतियों की हो सकती है और प्रत्येक अनुमति कई भूमिका की हो सकती है। इसलिए 3 टेबल होंगे। दो मॉडल और एक धुरी तालिका। एक roles
, users
और permission_role
तालिका।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class);
}
नोट 1
धुरी तालिका के लिए अलग तालिका नाम का उपयोग करते समय निम्नलिखित पर विचार करें।
आप उपयोग करना चाहते हैं मान लीजिए role_permission
के बजाय permission_role
, धुरी कुंजी नाम के निर्माण के लिए वाक्पटु का उपयोग करता है के रूप में वर्णमाला क्रम। आपको निम्न के रूप में दूसरे पैरामीटर के रूप में पिवट टेबल नाम पारित करना होगा।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission');
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission');
}
नोट 2
धुरी तालिका में विभिन्न प्रमुख नामों का उपयोग करते समय निम्नलिखित पर विचार करें।
एलोकेंट मानता है कि यदि कोई कुंजी तीसरे और चौथे पैरामीटर के रूप में पारित नहीं होती है तो यह _id
साथ एकवचन तालिका नाम होगा। तो यह मानता है कि धुरी होने दिया जाएगा role_id
और permission_id
क्षेत्रों। यदि इनके अलावा अन्य कुंजियों का उपयोग किया जाना है तो इसे तीसरे और चौथे मापदंडों के रूप में पारित किया जाना चाहिए।
अगर कहते हैं कि चलो other_role_id
बजाय role_id
और other_permission_id
के बजाय permission_id
इस्तेमाल किया जा रहा है। तो यह इस प्रकार होगा।
प्रेरणास्रोत
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}
अनुमति मॉडल
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}
WithPivot () का उपयोग करके इंटरमीडिएट तालिका तक पहुँचना
मान लीजिए कि आपके पास पिवट टेबल में एक तीसरा कॉलम ' अनुमति_अनुसूचित_डेट ' है। डिफ़ॉल्ट रूप से, केवल मॉडल कुंजियाँ धुरी वस्तु पर मौजूद होंगी। अब क्वेरी में इस कॉलम को प्राप्त करने के लिए आपको withPivot () फ़ंक्शन में नाम जोड़ना होगा।
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
}
संलग्न करना / पता लगाना
एलोकेंट संबंधित मॉडलों के साथ काम करने को अधिक सुविधाजनक बनाने के लिए कुछ अतिरिक्त सहायक विधियां भी प्रदान करता है। उदाहरण के लिए, मान लें कि उपयोगकर्ता के पास कई भूमिकाएँ हो सकती हैं और एक भूमिका में कई अनुमतियां हो सकती हैं। मॉडल में शामिल होने वाली मध्यवर्ती तालिका में एक रिकॉर्ड डालकर एक अनुमति के लिए एक भूमिका संलग्न करने के लिए, संलग्न विधि का उपयोग करें:
$role= App\Role::find(1);
$role->permissions()->attach($permissionId);
किसी मॉडल से संबंध जोड़ते समय, आप मध्यवर्ती तालिका में डाले जाने के लिए अतिरिक्त डेटा की एक सरणी भी पास कर सकते हैं:
$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);
इसी तरह, एक भूमिका के उपयोग के खिलाफ एक विशिष्ट अनुमति को हटाने के लिए अलग समारोह
$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);
संघों का समन्वय
आप कई-कई संघों के निर्माण के लिए सिंक विधि का उपयोग भी कर सकते हैं। इंटरमीडिएट टेबल पर रखने के लिए सिंक विधि आईडी की एक सरणी को स्वीकार करता है। कोई भी आईडी जो दी गई सारणी में नहीं है, उसे मध्यवर्ती तालिका से हटा दिया जाएगा। इसलिए, यह ऑपरेशन पूरा होने के बाद, दिए गए एरे में केवल आईडी ही मध्यवर्ती तालिका में मौजूद होगी:
//will keep permission id's 1,2,3 against Role id 1
$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);