Saya mengerti dengan pertanyaan Anda yang lain, bahwa suatu tugas dapat dimiliki oleh banyak karyawan, bukan? Jadi Anda harus menggunakan belongsToMany
hubungan dalam Task
. Anda model. Juga contoh koleksi "tugas" Anda menunjukkan bahwa dalam satu dokumen employee_id
adalah array dan di dokumen lain itu adalah ObjectId, ketika keduanya harus array.
Bagaimanapun, saya mengalami kesulitan untuk mencari tahu ini, tetapi saya telah melihat bahwa Anda tidak dapat menggunakan hasMany
sebagai kebalikan dari belongsToMany
, karena belongsToMany
membuat larik id, dan hasMany
tidak bekerja dengan baik dengan array. Saya akan mengatakan bahwa kita akan membutuhkan sesuatu seperti hasManyInArray
, tetapi ketika saya mengaitkan belongsToMany
hubungan, dokumen "induk" akan dibuat array id, yang membuat saya berpikir bahwa induk juga harus menggunakan belongsToMany
walaupun bukan "milik" tapi sebenarnya "memiliki". Jadi, ketika Anda akan mengaitkan seorang karyawan dengan tugas seperti ini:
$task->employees()->save($employee);
Dokumen "karyawan" akan memiliki atribut "task_ids" dengan satu-satunya id tugas yang seharusnya dimiliki. Jadi sepertinya itulah cara yang harus dilakukan Jenssegers:untuk menggunakan belongsToMany
di kedua model:
Laravel:Model:Karyawan:
<?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);
}
}
Laravel:Model:Tugas:
<?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);
}
}
Dan Anda akan menggunakan ini seperti:
// Give a task a new employee
$task->employees()->save($employee);
// Or give an employee a new task
$employee->tasks()->save($task);
Satu-satunya hal tentang ini adalah ketika Anda melihat database, Anda akan melihat bahwa dokumen karyawan Anda memiliki larik yang disebut "task_ids", dan di dalamnya, id dari satu-satunya tugas yang dimiliki setiap karyawan. Saya harap ini membantu.
Sekadar catatan, Anda tahu bahwa Anda tidak perlu mendefinisikan nama kunci utama pada setiap model, bukan? Anda tidak membutuhkan ini:
protected $primaryKey = '_id';
Anda juga tidak perlu menentukan nama koleksi (mis. protected $collection = 'employee';
), kecuali jika Anda benar-benar menginginkannya dalam bentuk tunggal (secara default mereka dalam bentuk jamak).
Saya bangun di tengah malam (ini jam 3:52 pagi di sini) dan memeriksa sesuatu di komputer dan kemudian memeriksa SO dan melihat pertanyaan Anda, saya harap kali ini saya menjawab cukup cepat untuk Anda, kami tampaknya berada di zona waktu yang berbeda.
Ini adalah dokumen yang saya buat untuk pengujian:
koleksi karyawan
{
"_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"
]
}
kumpulan tugas
{
"_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"
]
}
Dengan dokumen ini saya mendapatkan karyawan pertama seperti ini:
$employee = Employee::with('tasks')->first();
dd($employee);
Dan pada output kita dapat melihat atribut relasi adalah sebuah array:
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
metode tidak ada dalam file yang Anda sebutkan karena kelas itu (yaitu Jenssegers\Mongodb\Eloquent\Model
) memperluas kelas Eloquent Model Laravel, dan di situlah belongsToMany
metodenya adalah.
Ok jadi itu pasti mengapa itu tidak berhasil untuk Anda, karena array harus berupa string, bukan ObjectIds. Kenapa ini? Karena begitulah cara kerja perpustakaan Jenssegers, ia menyimpan Id sebagai string. Saya juga menemukan perilaku ini aneh, tetapi begitulah cara kerjanya. Ingatlah bahwa Anda seharusnya untuk menghubungkan objek menggunakan perpustakaan Jenssegers, bukan dengan membuat data secara manual di database. Bagaimana Anda bisa mengindeks id? Cukup buat indeks normal di MongoDB, seperti tasks.createIndex({task_ids: 1})
. Berikut dokumentasi tentang cara membuat indeks:https://docs .mongodb.com/manual/reference/method/db.collection.createIndex/
. Anda juga dapat membuat indeks tentang migrasi, berikut adalah dokumen tentang migrasi
, pastikan untuk membaca Catatan Jensseger tentang migrasi
juga.
Anda dapat mengakses tasks
realsi seperti ini:$employee->tasks;
. Anda mengakses relasi dengan mendapatkan properti dengan nama yang sama dengan metode yang Anda deklarasikan relasi Anda, jadi jika Anda memiliki:
class Post
{
public function owner()
{
return $this->belongsTo(User::class);
}
}
Anda mendapatkan relasi sebagai $post->owner;
. Berikut dokumentasi tentang hubungan:https://laravel.com/docs/5.3/eloquent-relationships