laravel中mysql和mongodb的关系

Posted

技术标签:

【中文标题】laravel中mysql和mongodb的关系【英文标题】:Mysql and mongodb relationship in laravel 【发布时间】:2019-02-22 13:10:05 【问题描述】:

这是我的父模型,它使用 mysql 类型的默认数据库连接。

class Property extends Model

  use SoftDeletes, HybridRelations;

  protected $hidden = [];

  public function propertyType()
  
     return $this->hasOne('App\RentHisto\Models\PropertyType');
  

这是我的 mongodb 模型,它与属性有关系

class PropertyDetail extends Model


 protected $connection = "mongodb";

 protected $collection = "property_details"; 

 public function propertyDetails()
    return $this->belongsTo(Property::class);
 

这是我使用 property_details 获取属性数据的查询

$properties = Property::with('propertyDetails')->get();

但问题是,当我尝试获取数据时,如果是属性详细信息,它会返回 null。这可能是由于,我们在与 mysql 实例的连接上调用了 mongodb 模型数据。那么有什么方法可以在两个模型(即mysql模型和mongodb模型)之间建立关系(hasOne)。谢谢!

【问题讨论】:

如果您使用 MariaDB(基于 MySQL 源代码),您可以使用 CONNECT 表引擎(mariadb.com/kb/en/library/connect)从 mongodb 文档(mariadb.com/kb/en/library/connect-mongo-table-type)创建 SQL 表 从我在jenssegers/laravel-mongodb 中读到的内容来看,HybridRelations 特征应该在 mongo 模型上,而不是 MySQL 模型上,所以在 PropertyDetail 而不是 Property 我认为它会添加到基本模型中。你可以在这里查看 [moloquent.github.io/master/relations/#mysql-relations] 【参考方案1】:

如果是混合数据库,您需要根据您的数据库使用情况在两个模型中定义 $connection。

尝试在您的属性模型中定义 $connection

protected $connection = 'mysql';

定义连接后,尝试在两个模型中定义与外键和本地键的关系参数。

class Property extends Model

    use HybridRelations;

    protected $connection = 'mysql';
    protected $table = 'YOUR_MYSQL_TABLE';    
    /**
     * Relationship to Mongodb Model
     */
    public function propertyType()
    
        return $this->hasMany(PropertyDetail::class, 'property_id', 'id');
    
.
.

property_id 是驻留在 mongodb 中的属性。

它必须与您的 MySql - 属性表中的 id 属性具有相同的数据类型。

如果您在 MySQL 属性表上使用 id 作为主键,请确保您在 mongodb 中的 property_id 也存储为整数。类型转换它以防它的字符串。

// Mongodb Model
class PropertyDetail extends Model

    protected $connection = 'mongodb';
    protected $collection = 'property_details';

    /**
     * Relationship to MySql
     */
    public function propertyDetails()
    
        return $this->belongsTo(Property::class, 'property_id', 'id');
    
.
.

【讨论】:

根据您的要求更改关系类型。 参考:github.com/jenssegers/…

以上是关于laravel中mysql和mongodb的关系的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB、Mysql 和关系

laravel-mongodb 怎么读写分离

mongodb为啥比mysql快

mongodb与mysql区别(超详细)

MongoDB 和 Artisan 在 Laravel 5 和 Lumen 上进行迁移

混合关系与非关系(MySQL 和 MongoDB)