2

I am using MongoDB library in Laravel 5.3. I have two collections in MongoDB and I want to make a hasMany relation b/w them.

MongoDB:

1st Collection: Employee

{
    "_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"
}

2nd Collection: Task

{
    "_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"
}

I have created pivot table between them

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:

Model:

Employee:

<?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');
    }
}

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');
    }
}   

Controller:

public function EmployeeData($data)
{
    $employee= Employee::find('586ca8c71a72cb07a681566d')->tasks;
    echo "<pre>";
    print_r($employee);
}

When I want to see task against employee it shows me below output:

Illuminate\Database\Eloquent\Collection Object
(
    [items:protected] => Array
        (
        )

)

How can I fix this?

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
okconfused
  • 3,567
  • 4
  • 25
  • 38
  • It seems like you already have these collections and you want Jenssegers library to fit your structure, instead of fiting your structure to Jenssegers, is that correct? So maybe your question actually is "how to make Jenssegers library work with this structure I have?"? As noted in the answer below, with this lib you don't use a pivot table, but you want (or have to work with) one anyway? – Parziphal Jan 05 '17 at 15:31
  • @Parziphal, yes you are right I have collections. Can you please answer this question posted in stack overflow. Its the same question but the difference is the collection relationship `http://stackoverflow.com/questions/41518875/laravel-mongodb-library-jenssegers-laravel-mongodb-hasmany-relationship-is-not' – okconfused Jan 07 '17 at 07:25

2 Answers2

3

in Mongo Eloquent when creating Many to Many relationships you dont need to have a pivot table, thats SQL mindset, in mongo-eloquent many to many relations the foreign keys are stored in arrays. So the models should look like this:

<?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');
    }
}  

Also you should load the relations before trying to retrieve them

 $employee= Employee::with('tasks')->find('586ca8c71a72cb07a681566d')->tasks;

You can save the relation the same way you do it in the hasMany relation

$employee->tasks()->save(new Task());
0

Yep, you need to use belongsToMany instead of hasMany in this case...