您好我正在使用jenssegers / laravel-mongodb与我现有的Mongodb数据库之一使用Laravel Elequent。
此数据库具有有线外键密钥数据,即
作者
1 | Xain
2 | JHON
图书
1 | book1 |作者$ 1
2 | book2 |作者$ 1
3 | book3 |作者$ 2
现在我在作者中使用Laravels关系,即
$ this-> hasMany(' App \ Books',' authorId',' ID');
由于authorId
中的前缀 authors $ ,这不起作用有什么建议吗?
答案 0 :(得分:0)
我在这里解决了这个问题是关于我是如何做到这一点的细节。如果有人也会遇到这类问题。
这个问题是因为使用了解析服务器数据库并试图从laravel的mongodb jenssegers / laravel-mongodb包中访问它
Parse-Server的数据库在forignkey的数据中有一个前缀,所以像hasOne,hasMany,belongsTo这样的关系似乎不起作用。
我创建一个基本模型并从中扩展所有模型,基本模型覆盖关系方法,即belongsTo
namespace App;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use App\Relations\BelongsTo;
class Model extends Eloquent
{
//
const CREATED_AT = '_created_at';
const UPDATED_AT = '_updated_at';
protected $primaryKey = '_id';
public function belongsTo($related, $foreignKey = null, $otherKey = null, $relation = null)
{
if (is_null($relation)) {
list($current, $caller) = debug_backtrace(false, 2);
$relation = $caller['function'];
}
// Check if it is a relation with an original model.
if (! is_subclass_of($related, \Jenssegers\Mongodb\Eloquent\Model::class)) {
return parent::belongsTo($related, $foreignKey, $otherKey, $relation);
}
if (is_null($foreignKey)) {
$foreignKey = Str::snake($relation).'_id';
}
$instance = new $related;
$query = $instance->newQuery();
$otherKey = $otherKey ?: $instance->getKeyName();
return new BelongsTo($query, $this, $foreignKey, $otherKey, $relation);
}}
这个belongsTO方法实际调用
BelongsTo
是的
\Jenssegers\Mongodb\Relations\BelongsTo
所以我也覆盖这个类
getEagerModelKeys(array $models)
和
match(array $models, Collection $results, $relation)
我自己的方法
blongsTo
类
App\Relations\BelongsTo;
并在这些方法中使用$ delimiter分解键值,以便在匹配父数据和子数据时删除$ sign之前的任何内容。
if (! is_null($value = explode('$', $model->{$this->foreignKey})[1]))
{
$keys[] = $value;
}
$keyValue = explode('$', $model->{$foreign})[1];
if (isset($dictionary[$keyValue])) {
$model->setRelation($relation, $dictionary[$keyValue])
;}