【问题标题】:hasMany relationship issue in Laravel 5.3 + MongoDB library 'jenssegers/laravel-mongodb'Laravel 5.3 + MongoDB 库“jenssegers/laravel-mongodb”中的 hasMany 关系问题
【发布时间】:2017-05-18 16:00:09
【问题描述】:

我在Laravel 5.3 中使用MongoDB 库。我在MongoDB 中有两个集合,我想与它们建立一个hasMany 关系。

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
        (
        )

)

我该如何解决这个问题?

【问题讨论】:

  • 您似乎已经拥有这些集合,并且您希望 Jenssegers 库适合您的结构,而不是让您的结构适合 Jenssegers,对吗?所以也许你的问题实际上是“如何让 Jenssegers 库与我拥有的这种结构一起工作?”?正如下面的答案所述,使用此库您不使用数据透视表,但无论如何您想要(或必须使用)一个?
  • @Parziphal,是的,你是对的,我有收藏。你能回答这个在堆栈溢出中发布的问题吗?同一个问题,不同的是集合关系`stackoverflow.com/questions/41518875/…'

标签: php mongodb laravel-5 laravel-5.3 jenssegers-mongodb


【解决方案1】:

在 Mongo Eloquent 中创建多对多关系时,您不需要数据透视表,这就是 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());

【讨论】:

    【解决方案2】:

    是的,在这种情况下,您需要使用 belongsToMany 而不是 hasMany...

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2014-08-04
      • 2016-07-26
      • 2019-08-27
      • 2017-03-11
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      相关资源
      最近更新 更多