Как запросить тип столбца в Laravel 7 и получить логические значения?

Есть ли способ определить, что определенный столбец в данной таблице базы данных имеет логический тип, и если это так, преобразовать 0 или 1 в нет и да?

У меня есть таблица с названием gearitems, в которой есть основная общая информация о предметах походного снаряжения (например, цена, вес, описание и т. д.), а также около 60 других таблиц взаимосвязей (например, рюкзаки, спальные мешки, палатки), каждая из которых имеет определенные особенности. в зависимости от типа снаряжения. Например, если это рюкзак, его вместимость указана в литрах, а если это палатка, то количество требуемых колышков и т. д. и т. д.

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

Для всех типов столбцов нет проблем с отображением данных по мере их вставки в базу данных, но логическое значение возвращает 1 или 0... Я не могу просто преобразовать все 1 и 0 в да или нет, так как другие значения могут быть 1 или 0, которые НЕ ЯВЛЯЮТСЯ логическими. Итак, я решил, что если бы я мог проверить, является ли тип столбца данными логического типа, я мог бы затем безопасно преобразовать значения в да или нет, но как я могу сделать это, без специального нацеливания на имя столбца? (поскольку список всех столбцов логического типа будет слишком длинным и сложным для редактирования в будущем)

Я создал таблицу под названием specialfeatures, которая содержит список всех названий специальных функций (таких как водонепроницаемость, ставки_требуемая вместимость_l и т. д.) в каждой таблице каждого типа снаряжения (рюкзаки, чемоданы и т. д.). Я подумал о добавлении столбца с именем boolean рядом со столбцом special_features_name, чтобы указать, является ли эта функция логической или нет, но это кажется очень грубым и неэлегантным способом сделать это. Наверняка есть лучший способ?

Если это поможет, вот соответствующие части моего кода:

Мой контроллер:

public function show(Manufacturer $manufacturer, GearItem $gearItem, GearCategory $gearCategory)
    { 
        // Get the item's special features Model's name:
        $featureModel = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->value('model_name');
        $specialFeatures =  'App\\'.$featureModel;

        // Get the manufacturer's name and homepage: 
        $manufacturer->name = $manufacturer::where('id', $gearItem->manufacturer_id)->value('name');
        $manufacturer->homepage = $manufacturer::where('id', $gearItem->manufacturer_id)->value('homepage');

        // Get all the item's special features: 
        $gearItem->features = $specialFeatures::where('gear_items_id', $gearItem->id)->get();
        
        // Iterator for the spacial features names:
        $featureNames = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->pluck('feature_name');
        $featureNames->title = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->pluck('feat_html');
        
        return view('gearitem.show', compact(['gearCategory', 'manufacturer', 'gearItem', 'featureNames']));
    }

Мой взгляд:

   @if($gearItem->url === null)
                <strong>{{$gearItem->name}}</strong> 
                @else
                <strong> <a target="_blank" href="{{$gearItem->url}}">{{$gearItem->name}}</a></strong>
                @endif
                by <strong><a target="_blank" href="{{$manufacturer->homepage}}">{{ $manufacturer->name }}</a></strong>

                <div class="specialFeatures">

                    <div class="row">
                        <div class="col-6">
                            <table class="table">

                                @foreach ($featureNames->title as $title)
                                <tr>
                                    <td>{!! $title !!}</td>
                                </tr>
                                @endforeach

                            </table>
                        </div>

                        <div class="col-6">
                            <table class="table">

                                @foreach ($featureNames as $featureName)
                                <tr>
                                    <td>{{  $gearItem->features[0][$featureName]}}</td>
                                </tr>
                                @endforeach

                            </table>
                        </div>
                    </div>
                </div>

Это то, что я сейчас получаю


person nurge    schedule 25.06.2020    source источник
comment
Опубликуйте свой код контроллера с вашим вопросом   -  person sta    schedule 25.06.2020
comment
@STA Не знаю, как это тебе поможет. Но я все равно сделал.   -  person nurge    schedule 25.06.2020
comment
@RonvanderHeijden - я видел это, но не понимаю, чем это полезно. Я не собираюсь хранить значения 0/1 как Нет/Да в методе хранения.   -  person nurge    schedule 25.06.2020
comment
@nurge, какие поля содержат логическое значение?   -  person sta    schedule 25.06.2020
comment
@STA, как я уже сказал в вопросе, существует около 60 различных таблиц с полями типа BOOLEAN. Вы не увидите их здесь, так как $specialFeatures = 'App\\'.$featureModel каждый раз меняет целевую модель в соответствии с типом предмета снаряжения. Каждая модель имеет свой набор столбцов, некоторые из которых имеют логический тип. Мне нужна функция, которая может ориентироваться на ЛЮБОЙ столбец логического типа, а затем преобразовывать его значения в ДА/НЕТ в зависимости от регистра и отправлять его в представление как таковое. Вместо 1/0.   -  person nurge    schedule 25.06.2020
comment
@nurge, как ты видишь это в своем лезвии? Вы можете опубликовать такой, как {{ $data->sample }}, чтобы я мог рассказать вам, как вы можете настроить это   -  person sta    schedule 25.06.2020
comment
@STA, если ты имеешь в виду, как это выглядит - просто добавил картинку. Иначе я действительно не понимаю, что вы имеете в виду...   -  person nurge    schedule 25.06.2020
comment
Давайте продолжим это обсуждение в чате.   -  person sta    schedule 25.06.2020


Ответы (1)


Итак, я нашел решение этой проблемы:

В модели, где есть логические значения, которые необходимо запросить, добавьте имя логической функции в качестве ключа и «логическое» в качестве значения следующим образом:

 protected $casts = [
        'waterproof' => 'boolean'
    ];

Затем в контроллере:

// Get all the item's special features and "clean" them: 
        $specialFeaturesValues = $specialFeatures::where('gear_items_id', $gearItem->id)->get();
        $specialFeaturesRejects = ['id' => 'xy', 'gear_items_id' => 'xy', 'created_at' => 'xy', 'updated_at' => 'xy'];
        $specialFeaturesClean = array_diff_key($specialFeaturesValues[0]->getAttributes(), $specialFeaturesRejects);

  $booleanFeatures = array_keys($specialFeaturesValues[0]->getCasts(), 'boolean');

        foreach($booleanFeatures as $booleanFeature){
            if ($specialFeaturesClean[$booleanFeature] > 0){
                $specialFeaturesClean[$booleanFeature] = 'Yes';
            } elseif($specialFeaturesClean[$booleanFeature] === 0){
                $specialFeaturesClean[$booleanFeature] = 'No';
            } else {
                $specialFeaturesClean[$booleanFeature] = 'Unknown';
            };

        }

(не забудьте отправить $specialFeaturesClean в представление с compact())

в представлении лезвия этот простой цикл foreach будет отображать чистые значения, заменяя 1 (или любое другое истинное значение) на Да, 0 на Нет и Нуль на Неизвестно. (см. картинку, например)

введите здесь описание изображения

Надеюсь, это будет полезно... ;-)

person nurge    schedule 29.06.2020