Laravel Elequent Relationships外键我的数据集的问题有前缀

时间:2017-04-20 11:17:25

标签: php mongodb laravel foreign-keys

您好我正在使用jenssegers / laravel-mongodb与我现有的Mongodb数据库之一使用Laravel Elequent。

此数据库具有有线外键密钥数据,即

作者

ID |名称

1 | Xain

2 | JHON

图书

ID |名字| AUTHORID

1 | book1 |作者$ 1

2 | book2 |作者$ 1

3 | book3 |作者$ 2

现在我在作者中使用Laravels关系,即

$ this-> hasMany(' App \ Books',' authorId',' ID');

由于authorId

中的前缀 authors $ ,这不起作用

有什么建议吗?

1 个答案:

答案 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])
    ;}