Функциональность поиска рекурсивных отношений - PullRequest
0 голосов
/ 01 июля 2019

Привет, у меня есть проект 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 . '%');
        });
    }

Это анонамизная функция перед возвратом запроса.Я получаю сообщение об ошибке, что поля не существуют, но я думаю, что даже если бы они сделали, это будет работать только для данных 2-го до верхнего уровня.

Мне бы хотелось, чтобы он провел глубокий поиск всех своих детей, любая помощь приветствуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...