मैं आपके दूसरे प्रश्न से समझ गया, कि एक कार्य कई कर्मचारियों से संबंधित हो सकता है, है ना? तो आपको belongsToMany
. का उपयोग करना चाहिए आपके Task
. में संबंध नमूना। साथ ही आपका उदाहरण "कार्य" संग्रह दर्शाता है कि एक दस्तावेज़ में employee_id
एक सरणी है और दूसरे दस्तावेज़ में यह एक ObjectId है, जब दोनों को सरणियाँ होनी चाहिए।
वैसे भी, मुझे इसका पता लगाने में कठिन समय लगा है, लेकिन मैंने देखा है कि आप hasMany
का उपयोग नहीं कर सकते जैसा कि belongsToMany
. का विलोम है , क्योंकि belongsToMany
आईडी की एक सरणी बनाता है, और hasMany
सरणियों के साथ अच्छी तरह से काम नहीं करता है। मैं कहूंगा कि हमें कुछ इस तरह की आवश्यकता होगी hasManyInArray
, लेकिन जब मैं एक belongsToMany
. को संबद्ध करता हूं संबंध, "पैरेंट" दस्तावेज़ आईडी की एक सरणी बनाता है, जो मुझे लगता है कि माता-पिता को भी belongsToMany
का उपयोग करना चाहिए भले ही यह "संबंधित" नहीं है लेकिन वास्तव में "है"। तो जब आप किसी कर्मचारी को इस तरह के कार्य से जोड़ेंगे:
$task->employees()->save($employee);
"कर्मचारी" दस्तावेज़ में "task_ids" विशेषता होगी, जिसके पास एकमात्र कार्य आईडी होनी चाहिए। तो ऐसा लगता है कि जेन्सेजर्स के साथ जाने का तरीका है:belongsToMany
का उपयोग करने के लिए दोनों मॉडलों में:
लारवेल:मॉडल:कर्मचारी:
<?php
namespace App\Models;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Employee extends Eloquent
{
protected $collection = 'employee';
public function tasks()
{
return $this->belongsToMany(Task::class);
}
}
लारवेल:मॉडल:कार्य:
<?php
namespace App\Models;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Task extends Eloquent
{
protected $collection = 'task';
public function employees()
{
return $this->belongsToMany(Employee::class);
}
}
और आप इसे इस तरह इस्तेमाल करेंगे:
// Give a task a new employee
$task->employees()->save($employee);
// Or give an employee a new task
$employee->tasks()->save($task);
इसके बारे में एकमात्र बात यह है कि जब आप डेटाबेस को देखते हैं, तो आप देखेंगे कि आपके कर्मचारी दस्तावेज़ों में "task_ids" नामक एक सरणी है, और इसके अंदर, प्रत्येक कर्मचारी के पास एकमात्र कार्य की आईडी है। मुझे आशा है कि इससे मदद मिली।
बस कुछ साइड नोट्स, आप जानते हैं कि आपको प्रत्येक मॉडल पर प्राथमिक कुंजी के नाम को परिभाषित करने की आवश्यकता नहीं है, है ना? आपको इसकी आवश्यकता नहीं है:
protected $primaryKey = '_id';
साथ ही आपको संग्रह के नाम को परिभाषित करने की आवश्यकता नहीं है (अर्थात protected $collection = 'employee';
), जब तक कि आप वास्तव में उन्हें एकवचन में नहीं रखना चाहते (डिफ़ॉल्ट रूप से वे बहुवचन में होते हैं)।
मैं आधी रात को उठा (यहां 3:52 बजे हैं) और कंप्यूटर पर कुछ चेक किया और फिर SO की जाँच की और आपका प्रश्न देखा, मुझे आशा है कि इस बार मैंने आपके लिए जल्द ही उत्तर दिया, हम अलग-अलग समय क्षेत्रों में प्रतीत होते हैं।
ये वे दस्तावेज़ हैं जिन्हें मैंने परीक्षण के लिए बनाया है:
कर्मचारी संग्रह
{
"_id" : ObjectId("5870ba1973b55b03d913ba54"),
"name" : "Jon",
"updated_at" : ISODate("2017-01-07T09:51:21.316Z"),
"created_at" : ISODate("2017-01-07T09:51:21.316Z"),
"task_ids" : [
"5870ba1973b55b03d913ba56"
]
},
{
"_id" : ObjectId("5870ba1973b55b03d913ba55"),
"name" : "Doe",
"updated_at" : ISODate("2017-01-07T09:51:21.317Z"),
"created_at" : ISODate("2017-01-07T09:51:21.317Z"),
"task_ids" : [
"5870ba1973b55b03d913ba56"
]
}
कार्य संग्रह
{
"_id" : ObjectId("5870ba1973b55b03d913ba56"),
"name" : "New Task",
"updated_at" : ISODate("2017-01-07T09:51:21.317Z"),
"created_at" : ISODate("2017-01-07T09:51:21.317Z"),
"employee_ids" : [
"5870ba1973b55b03d913ba54",
"5870ba1973b55b03d913ba55"
]
}
इन दस्तावेजों के साथ मुझे इस तरह का पहला कर्मचारी मिलता है:
$employee = Employee::with('tasks')->first();
dd($employee);
और आउटपुट में हम देख सकते हैं कि संबंध विशेषता एक सरणी है:
Employee {#186 ▼
#collection: "employee"
#primaryKey: "_id"
// Etc.....
#relations: array:1 [▼
"tasks" => Collection {#199 ▼
#items: array:1 [▼
0 => Task {#198 ▼
#collection: "task"
#primaryKey: "_id"
// Etc....
#attributes: array:5 [▼
"_id" => ObjectID {#193}
"name" => "New Task"
"updated_at" => UTCDateTime {#195}
"created_at" => UTCDateTime {#197}
"employee_ids" => array:2 [▶]
]
}
]
}
]
}
belongsToMany
विधि आपके द्वारा उल्लिखित फ़ाइल में नहीं है क्योंकि वह वर्ग (यानी Jenssegers\Mongodb\Eloquent\Model
) लारवेल के एलोक्वेंट मॉडल वर्ग का विस्तार करता है, और यहीं पर belongsToMany
विधि है।
ठीक है तो यही कारण है कि यह आपके लिए काम नहीं कर रहा है, क्योंकि सरणी को ऑब्जेक्ट आईडी के बजाय स्ट्रिंग होना चाहिए। ऐसा क्यों है? क्योंकि जेन्सेजर्स लाइब्रेरी इस तरह काम करती है, यह आईडी को स्ट्रिंग्स के रूप में सहेजती है। मुझे यह व्यवहार भी अजीब लगा है, लेकिन यह इसी तरह काम करता है। याद रखें कि आपको माना जाता है डेटाबेस में मैन्युअल रूप से डेटा बनाकर नहीं, जेन्सेजर्स लाइब्रेरी का उपयोग करके वस्तुओं को जोड़ने के लिए। आप आईडी को कैसे अनुक्रमित कर सकते हैं? MongoDB में बस एक सामान्य अनुक्रमणिका बनाएं, जैसे tasks.createIndex({task_ids: 1})
. इंडेक्स बनाने के तरीके के बारे में यहां दस्तावेज़ है:https://docs .mongodb.com/manual/reference/method/db.collection.createIndex/
. आप माइग्रेशन पर इंडेक्स भी बना सकते हैं, यहां माइग्रेशन पर डॉक्स दिए गए हैं
, जेन्सेजर्स के माइग्रेशन पर नोट्स
पढ़ना सुनिश्चित करें भी।
आप tasks
तक पहुंच सकते हैं इस तरह की वास्तविकता:$employee->tasks;
. जिस विधि से आपने अपना संबंध घोषित किया है, उसी नाम से एक संपत्ति प्राप्त करके आप संबंधों तक पहुँच प्राप्त करते हैं, इसलिए यदि आपके पास:
class Post
{
public function owner()
{
return $this->belongsTo(User::class);
}
}
आपको संबंध $post->owner;
. के रूप में मिलता है . यहाँ संबंधों पर दस्तावेज़ीकरण है:https://laravel.com/docs/5.3/eloquent-relationships