php - Laravel 5.3 + MongoDB 库中的 hasMany 关系问题 'jenssegers/laravel-mongodb'

标签 php mongodb laravel-5 jenssegers-mongodb

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

MongoDB:

第一个收藏: 员工

{
    "_id" : ObjectId("586ca8c71a72cb07a681566d"),
    "employee_name" : "John",
    "employee_description" : "test description",
    "employee_email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e2888d8a8ca2878f838b8ecc818d8f" rel="noreferrer noopener nofollow">[email protected]</a>",
    "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" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="721113001e1d0132171f131b1e5c111d1f" rel="noreferrer noopener nofollow">[email protected]</a>",
    "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');
    }
}   

Controller :

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

当我想查看针对员工的任务时,它会显示以下输出:

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

)

我该如何解决这个问题?

最佳答案

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

关于php - Laravel 5.3 + MongoDB 库中的 hasMany 关系问题 'jenssegers/laravel-mongodb',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462510/

相关文章:

java - SpringBoot 使用 MongoDB 实现通用 DAO

mongodb - 为什么mongo-go-driver聚合结果对象键返回 "Key"

php - 从数据透视表中检索数据

PHP/Mysql 在现有表中插入多行以进行 csv 输出

node.js - “w”不被识别为内部或外部命令、可操作程序或批处理文件

java - 从 java 运行 php

php - Laravel : Check if record exists Before Insertion

mysql - 尝试将外键设置为字符串数据类型

php - 通过 Laravel 中的 Controller 动态执行种子命令

PHP GD & Imagick - 有什么方法可以测量图像处理进度吗?