Я использую библиотеку MongoDB
в Laravel 5.3
. У меня есть две коллекции в MongoDB
и я хочу сделать hasMany
отношение b / w их.
MongoDB:
Первая коллекция: Сотрудник
{ "_id" : ObjectId("586ca8c71a72cb07a681566d"), "employee_name" : "John", "employee_description" : "test description", "employee_email" : "john@email.com", "updated_at" : "2017-01-04 11:45:20", "created_at" : "2017-01-04 11:45:20" }, { "_id" : ObjectId("586ca8d31a72cb07a6815671"), "employee_name" : "Carlos", "employee_description" : "test description", "employee_email" : "carlos@email.com", "updated_at" : "2017-01-04 11:45:20", "created_at" : "2017-01-04 11:45:20" }
Вторая коллекция: задача
{ "_id" : ObjectId("586ccbcf1a72cb07a6815b04"), "task_name" : "New Task", "task_description" : "test description", "task_status" : 1, "task_created_at" : "2017-04-01 02:17:00", "task_updated_at" : "2017-04-01 02:17:00" }, { "_id" : ObjectId("586cd3261a72cb07a6815c69"), "task_name" : "2nd Task", "task_description" : "test description", "task_status" : 1, "task_created_at" : "2017-04-01 02:17:00", "task_updated_at" : "2017-04-01 02:17:00" }
Я создал сводную таблицу между ними
Employee_Task
{ "_id" : ObjectId("586cd0cb1a72cb07a6815bf3"), "employee_task_employee_id" : "586ca8c71a72cb07a681566d", "employee_task_task_id" : "586ccbcf1a72cb07a6815b04", "status" : 1 }, { "_id" : ObjectId("586cd7851a72cb07a6815d7d"), "employee_task_employee_id" : "586ca8c71a72cb07a681566d", "employee_task_task_id" : "586cd3261a72cb07a6815c69", "status" : 1 }
Laravel:
Модель:
Наемный рабочий:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Employee extends Eloquent { protected $collection = 'employee'; protected $primaryKey = '_id'; public function tasks() { return $this->hasMany('App\Models\Task'); } }
Задача:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Task extends Eloquent { protected $collection = 'task'; protected $primaryKey = '_id'; public function employees() { return $this->belongsToMany('App\Models\Employee'); } }
контроллер:
public function EmployeeData($data) { $employee= Employee::find('586ca8c71a72cb07a681566d')->tasks; echo "<pre>"; print_r($employee); }
Когда я хочу увидеть задачу против сотрудника, она показывает мне ниже:
Illuminate\Database\Eloquent\Collection Object ( [items:protected] => Array ( ) )
Как я могу это исправить?
в Mongo Eloquent при создании отношений Many to Many вам не нужно иметь сводную таблицу, то есть SQL-мышление, в mongo-eloquent от многих до многих отношений внешние ключи хранятся в массивах. Поэтому модели должны выглядеть так:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Employee extends Eloquent { protected $collection = 'employee'; protected $primaryKey = '_id'; public function tasks() { return $this->belongsToMany('App\Models\Task'); } } <?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Task extends Eloquent { protected $collection = 'task'; protected $primaryKey = '_id'; public function employees() { return $this->belongsToMany('App\Models\Employee'); } }
Также вы должны загрузить отношения, прежде чем пытаться их восстановить
$employee= Employee::with('tasks')->find('586ca8c71a72cb07a681566d')->tasks;
Вы можете сохранить отношение так же, как вы это делаете в отношении hasMany
$employee->tasks()->save(new Task());
Да, в этом случае вам нужно использовать ownToMany вместо hasMany …