MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Pustaka Laravel MongoDB 'jenssegers/laravel-mongodb' memiliki Banyak hubungan tidak berfungsi

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara mengurutkan berdasarkan 'nilai' dari kunci tertentu dalam properti yang disimpan sebagai array dengan pasangan k-v di mongodb

  2. Bagaimana cara menjalankan sejumlah kriteria dinamis di luwak.find?

  3. $addFields bersarang di MongoDB

  4. Kueri bersarang luwak pada Model berdasarkan bidang model yang direferensikannya

  5. `bidang tidak boleh sama:' ' dan ' ` kesalahan mongoimport