Как получить наивысшее свойство от красноречивого объекта Laravel? - PullRequest
0 голосов
/ 16 февраля 2019

рассмотрим следующий объект модели:

App\Modules\CharacterSheets\Models\CharacterSheet {#826
  ...
  #attributes: array:39 [
    "id" => 1
    "user_id" => 1
    "race_id" => 1
    "class_id" => null
    "strength" => 35
    "dexterity" => 35
    "agility" => 55
    "intelligence" => 30
    "health" => 120
    "haste" => 0
    "precision" => 0
    "dodge" => 0
    "crit" => 0
    "steal_health" => 5
    "gold" => 0
    "deffense" => 7
    "damage" => 10
    "cast_damage" => 10
    "antique_damage" => 0
    "heal_for" => 10
    "level" => 1
    "train_exp" => 0
    "level_exp" => 200
    "location" => "0, 0"
    "next_level_exp" => 1000
    "next_train_level_exp" => 300
    "max_level" => 500
    "armor_class" => 17
    "block_bonus" => 3
    "hit_bonus" => 2
    "has_to_train" => 0
    "primary_attack_stat" => "health"
    "primary_attack_bonus" => "2.00"
    "penalty_stat" => null
    "penalty" => null
    "damage_subtraction" => null
    "chance_to_attack_twice" => null
    "created_at" => "2019-02-16 01:26:04"
    "updated_at" => "2019-02-16 01:56:42"
  ]
  ...
}

Что я хотел бы сделать, динамически , это проверить, какая из следующих характеристик является самой высокой: strength, dexterity, agility, intelligence, health

Я хочу сохранить объект как есть, но вернуть имя свойства в виде строки

Так, например, с вышеуказанным объектом,У меня должна быть функция, которая возвращает health.

Опять же, это должно быть динамическим .

Я не видел никаких методов сбора laravel, которые бы делали это, поэтомуЯ спрашиваю здесь, так как понятия не имею, как это сделать.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Сначала сделайте логику.В этом случае мы будем использовать Коллекции Laravel :

// CharacterSheet.php

public function highestProperty()
{
    // temporal variable
    $temp = collect();

    // populating the temporal variable
    collect(['strength', 'dexterity', 'agility', 'intelligence', 'health'])
        ->each(function ($property) use ($temp) {
            return $temp->put($property, $this->$property);
        });

    // searching the property of the highest value
    return $temp->search(
        // getting the highest value
        $temp->reduce(function ($highest, $value) {
            return ($highest < $value) ? $value : $highest;
        })
    );
}

Затем создайте аксессор , чтобы вы могли сделать $characterSheet->highest_property:

// CharacterSheet.php

public function getHighestPropertyAttribute()
{
    return $this->highestProperty();
}

Вы можете даже добавить это значение к каждому CharacterSheet добавлению значения в конфигурацию модели $appends:

// CharacterSheet.php

$appends = ['highest_property'];

Теперь, когда вы получаете экземпляриз CharacterSheet, вы можете использовать его как любой другой атрибут:

$characterSheet = CharacterSheet::first();

dd($characterSheet->highest_property);

// this could output, if the case: "dexterity"
0 голосов
/ 16 февраля 2019

Извлечение свойства из модели и поиск ключа максимального значения.

function getHighestProperty(Model $model, array $keys): string
{
    $filter = array_flip($keys);
    $array = collect($model->toArray());
    return $array->intersectByKeys($filter)->sort()->flip()->last();
}
0 голосов
/ 16 февраля 2019

Я бы сделал так, хотя я не пробовал:

Сначала мы создадим массив атрибутов, которые нам нужны.

$array = [
    'strength', 'dexterity', 'agility', 'intelligence', 'health',
];

Затем создайте коллекцию результатов длясохраните данные листа, которые доступны в указанном выше $array.

$result = collect();

Зациклите лист и проверьте, существует ли ключ в указанном выше массиве.Если он существует, мы поместим его в коллекцию $result.

foreach ($characterSheet as $key => $sheetAttribute) {
    if (in_array($key, $array)) {
        $result->put($key, $sheetAttribute);
    }
}

Затем мы можем отсортировать коллекцию $result, используя метод sort , чтобы получить минимальное значение вместе сего ключ.Затем вы можете перевернуть его, чтобы получить ключ, связанный с этим значением, и вернуть элемент last , потому что вы хотите максимум.

$result->sort()->flip()->last();

Итогда вы можете просто dd($result) и проверить, действительно ли это то, что вы искали.

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