खोज…


रिश्तों पर सवाल करना

स्पष्ट रूप से आपको परिभाषित रिश्तों पर क्वेरी करने की सुविधा मिलती है, जैसा कि नीचे दिखाया गया है:

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]);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow