递归关系搜索功能

时间:2019-07-01 10:15:29

标签: php laravel eloquent

嗨,我有一个laravel项目,我在这里使用递归模型。它工作正常,但我希望能够在任何子字段与搜索查询匹配的情况下返回结果。

这是我的数据模型

/**
* Declares the relationship between a log and its children
* @access public
* @return Illuminate\Database\Eloquent\Relations\Relation
*/
public function children()
{
    return $this->hasMany(self::class, 'parent', 'id');
}

/**
* Declares the relationship between a log and its parent
* @access public
* @return Illuminate\Database\Eloquent\Relations\Relation
*/
public function parent()
{
    return $this->belongsTo(self::class, 'parent', 'id');
}

/**
* Declares the relationship between a log and its meta data/ children
* @access public
* @return Illuminate\Database\Eloquent\Relations\Relation
*/
public function metaData()
{
    return $this->hasMany(MetaData::class, 'parent', 'id');
}

这是我的元数据模型

/**
* Declares the relationship between meta data and its parent
* @access public
* @return Illuminate\Database\Eloquent\Relations\Relation
*/
public function parent()
{
    return $this->belongsTo(Data::class, 'parent', 'id');
}

因此,数据是顶层,每个数据点都可以包含元数据,但是元数据也可以包含数据,这意味着它将降到另一个层次。

这是我用来列出它们的内容

 $query = Self::select('data.id', 'data.created_at', 'data.type')
                 ->whereNull('parent');

    //If the user has declared a type, filter it by that type
    if ($type)
    {
        $query->where('type', $type);
    }

    $query->with('children.metaData');

    return $query->paginate($display);

这很好用,但是要在此过程中加入搜索功能...

if ($search)
    {
        $query->where(function($query) use ($search)
        {
            return $query->where('metaData.name', 'LIKE', '%' . $search . '%')
                         ->orWhere('metaData.value', 'LIKE', '%' . $search . '%');
        });
    }

在返回查询之前,这是一个匿名酶功能。我收到了字段不存在的错误,但我认为即使存在,也仅适用于第二层到顶层数据。

我希望它可以对所有子项进行深入搜索,感谢您的帮助

0 个答案:

没有答案