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