Laravel Фильтр отношений + Получить наиболее распространенный - PullRequest
0 голосов
/ 15 марта 2020

Я полу новичок в laravel, и мне действительно тяжело в этой ситуации. По сути, мне нужно извлекать животных, которые имеют атрибуты, но только там, где для данной категории выбран наиболее помеченный атрибут. Например, если животное помечено с категорией атрибута «размер», и существуют различные метки для этой категории как «большой», «большой», «большой», «средний», «маленький», «маленький», это будет только получить атрибут размера как «большой», поскольку он встречается чаще всего.

Категории - это родители, находящиеся во вложенных отношениях для своих детей. Таким образом, категория «размер» может быть в атрибуте таблицы БД с идентификатором 5. Она имеет трех дочерних элементов в одной таблице с идентификаторами 6 (большой), 7 (средний) и 8 (маленький) с parent_attribute_id, равным 5.

Таким образом, пользователь может войти и пометить животное как «большое». Это помещает запись в сводную таблицу с именем animal_attribute, с animal_id, attribute_id и user_id. Так что у этой сводной таблицы будет много идентификаторов атрибутов, у которых parent_attribute_ids равен 5. Но я хочу получить выигрышный (наиболее часто встречающийся).

БД - MySQL, вот отношения:

Животное:

класс Животное расширяет Модель {

public function attributes() {
    return $this->belongsToMany('App\Attribute');
}

public function pics() {
    return $this->hasMany('App\Pic'); 
}

public function lists() {   
    return $this->belongsToMany('App\Lists', "list_pic");
}

}

Атрибут:

Атрибут класса расширяет Модель {

public function parent() {
    return $this->belongsTo('App\Attribute','parent_attribute_id')->with('parent');
}

public function children() {
    return $this->hasMany('App\Attribute','parent_attribute_id')->with('children');
}

public function thisChild() {
    return $this->hasMany('App\Attribute','parent_attribute_id');
}

public function thisParent() {
    return $this->belongsTo('App\Attribute', 'parent_attribute_id');
}

public function animals() {
    return $this->belongsToMany("App\Animal");
}

public function pics() {
    return $this->belongsToMany("App\Pic");
}

}

Это самое близкое, что я получил, но оно все еще далеко, так как подсчитывает все атрибуты, которые соответствуют критериям, а не атрибуты для каждого животного;

$animalFilters = [512,502]; <--- I would get this from whatever input, manually for this test.

// ** get all sibling IDs ** //
$attributes = Attribute::with("thisParent.thisChild")->whereIn('id',$animalFilters)->get();

$allChildren = array();
foreach($attributes as $attribute) {
    foreach($attribute->thisParent->thisChild as $child) {
        array_push($allChildren,$child->id);
    }
}

// ** find winning (most occurred) siblings for each attribute for each animal ** //
$animals = Animal::with(
            ['attributes' => function ($query) use($allChildren) {
                $query->where('id', $allChildren)
                ->select('attributes.*', DB::raw('COUNT(id) as votes'))
                ->groupBy('id')->orderBy('votes');
            }
            ])->get();

Это будет просто отобразите каждое животное с отношением атрибутов с одним самым большим подсчитанным атрибутом для всех животных. Я хотел получить максимальный подсчитанный атрибут для каждого животного, основанный на каждой категории (parent_attribute_id).

Мне действительно тяжело выполнить / обернуть свой мозг вокруг этого. Я не уверен, что полностью понимаю последствия этого типа отношений / запросов. Я рассматриваю другой метод, но сначала я хочу, чтобы это сработало, чтобы понять, насколько это дорого на самом деле.

Любая помощь приветствуется, спасибо.

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