2017-01-04 4 views
1

Я использую MongoDB библиотеку в Laravel 5.3. У меня две коллекции в MongoDB, и я хочу сделать связь hasMany.hasMany вопрос о проблемах в Laravel 5.3 + Библиотека MongoDB 'jenssegers/laravel-mongodb'

MongoDB:

первая коллекция: Сотрудник

{ 
    "_id" : ObjectId("586ca8c71a72cb07a681566d"), 
    "employee_name" : "John", 
    "employee_description" : "test description", 
    "employee_email" : "[email protected]", 
    "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" : "[email protected]", 
    "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 
     (
     ) 

) 

Как это исправить?

+0

Кажется, что у вас уже есть эти коллекции, и вы хотите, чтобы библиотека Jenssegers соответствовала вашей структуре, вместо того чтобы соответствовать вашей структуре Jenssegers, это правильно? Так что, может быть, ваш вопрос на самом деле заключается в том, «как заставить библиотеку Jenssegers работать с этой структурой?»? Как отмечено в ответе ниже, с этим lib вы не используете сводную таблицу, но хотите (или должны работать) в любом случае? – Parziphal

+0

@ Parziphal, да, вы правы. У меня есть коллекции. Не могли бы вы ответить на этот вопрос, отправленный в переполнение стека. Это тот же вопрос, но разница заключается в том, что отношения коллекции 'http://stackoverflow.com/questions/41518875/laravel-mongodb-library-jenssegers-laravel-mongodb-hasmany-relationship-is-not ' – okconfused

ответ

3

в 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()); 
0

Да, вам нужно использовать ownToMany, а не hasMany в этом случае ...

Смежные вопросы