//Function
public function getTree()
{
return AttributeGroupModel::query()->with('attributes')->get()->transform(function ($group) {
return [
'id' => $group->id,
'name' => AdminService::trans($group->name),
'values' => $group->attributes->map(function ($attribute) use ($group) {
return [
'id' => $attribute->id,
'name' => AdminService::trans($attribute->name),
'group_id' => $group->id,
];
})
];
});
}
//Model
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
use SpatieTranslatableHasTranslations;
class AttributeGroupModel extends Model
{
use HasFactory, SoftDeletes;
protected $table = "attribute_groups";
protected $fillable = [
"id",
"name",
"sort_order"
];
protected $casts = [
'name' => 'array',
];
public function attributes()
{
return $this->hasMany(AttributeModel::class, 'attribute_group_id', 'id');
}
}
public function autocomplete(array $tree, $parent_id = 0, $parent_name = null)
{
$result = [];
foreach ($tree as $item) {
if (!empty($parent_name)) {
$name = $parent_name . ' > ' . AdminService::trans($item['title']);
} else {
$name = AdminService::trans($item['title']);
}
$result[] = [
'id' => $item['id'],
'title' => $name,
];
if (count($item['children']) > 0) {
$result = array_merge($result, $this->autocomplete($item['children'], $parent_id, $name));
}
}
return $result;
}