猿问

如何在 Laravel 7 中查询列类型并检索布尔值?

有没有办法能够判断给定数据库表中的某个列是“布尔”类型,如果是,则将“0”或“1”转换为“否”和“是”?

我有一个名为“gearitems”的表,其中包含有关远足装备项目的基本一般信息(如价格、重量、描述等),然后我还有近 60 个其他“一对一”关系表(例如:“背包”、“睡袋”、 “帐篷”)根据装备的类型都有特定的“特殊功能”。例如,如果是背包,则容量以升为单位,但如果是帐篷,则需要的木桩数量等。

我遇到的问题是,许多这些小的“特殊功能”表都有不同名称的布尔类型列(例如“背包”中的“防水”或“睡袋”中的“可附加”),当我想向用户显示对于特定的齿轮件,我有一个函数可以将一般的“gearitems”表连接到相应的特定齿轮类型表。

对于所有列类型,显示数据插入数据库时都没有问题,但布尔值返回“1”或“0”...我不能将所有“1”和“0”转换为“是” " 或 "no",因为其他值可能是 1 或 0,它们不是布尔值。所以我想,如果我可以检查列类型是否是布尔类型数据,我就可以安全地将值转换为是或否,但是如果不专门针对列的名称,我该如何做到这一点呢?(因为所有布尔类型列的列表会太长并且将来难以编辑)

我创建了一个名为“specialfeatures”的表,其中包含每个装备类型(“背包”、sllepingbags”等)的每个表中的所有特殊功能名称(如“防水”、“stakes_required”、“capacity_l”等)的列表)。我考虑过在special_features_name列旁边添加一个名为“boolean”的列来指示该功能是否为布尔值,但这似乎是一种非常粗糙且不优雅的方法。当然有更好的方法吗?

如果有帮助,这是我的代码中的相关部分:

我的控制器:


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']));

    }


白板的微信
浏览 134回答 1
1回答

冉冉说

所以我找到了解决这个问题的方法:在需要查询布尔值的模型中,将布尔特征的名称添加为键,将“boolean”添加为值,如下所示: 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”替换为“否”,将“空”替换为“未知”。(例如见图片)
随时随地看视频慕课网APP
我要回答