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的关系的主要内容,如果未能解决你的问题,请参考以下文章