Привет, у меня есть проект 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-го до верхнего уровня.
Мне бы хотелось, чтобы он провел глубокий поиск всех своих детей, любая помощь приветствуется