Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel 7中查询列类型并检索布尔值?_Php_Mysql_Eloquent_Laravel 7 - Fatal编程技术网

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

Php 如何在Laravel 7中查询列类型并检索布尔值?,php,mysql,eloquent,laravel-7,Php,Mysql,Eloquent,Laravel 7,是否有一种方法可以判断给定数据库表中的某一列的类型为“boolean”,如果是,则将“0”或“1”转换为“No”和“Yes” 我有一个名为“gearitems”的表,其中包含了有关徒步旅行装备项目的基本信息(如价格、重量、描述等),然后我还有近60个其他“一对一”关系表(例如:“背包”、“睡袋”、“帐篷”),根据装备的类型,这些表都有特定的“特殊功能”。例如,如果它是一个背包,它的容量以升为单位,但是如果它是一个帐篷,它需要的木桩数量等等 我遇到的问题是,这些小型“特殊功能”表中有许多具有不同名

是否有一种方法可以判断给定数据库表中的某一列的类型为“boolean”,如果是,则将“0”或“1”转换为“No”和“Yes”

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

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

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

我已经创建了一个名为“specialfeatures”的表格,其中包含了每种装备类型(“背包”、“sllepingbags”等)的每个表格中所有特殊功能的名称(如“防水”、“所需木桩”、“容量”等)“在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']));
    }
// 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';
            };

        }
我的看法是:

   @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>
@if($gearItem->url==null)
{{$gearItem->name}}
@否则

@恩迪夫
通过
@foreach($featureNames->title作为$title)
{!!$title!!}
@endforeach
@foreach($featureName作为$featureName)
{{$gearItem->features[0][$featureName]}
@endforeach

所以我找到了解决这个问题的方法:

在需要查询布尔值的模型中,将布尔特征的名称添加为键,将“布尔”添加为值,如下所示:

 protected $casts = [
        'waterproof' => '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']));
    }
// 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';
            };

        }
(不要忘记使用
compact()
$specialfeatureclean
发送到视图)

在刀片视图中,这个简单的
foreach
循环将显示“干净”值,将“1”(或任何其他真实值)替换为“是”,“0”替换为“否”,将“空”替换为“未知”。(如图所示)


我希望这是有帮助的…;-)

将控制器代码与question@STA不知道这对你有什么帮助。但我还是做了。@RonvanderHeijden-我看到了,我不认为这有什么帮助。我不打算在store方法中将0/1值存储为No/Yes。@nurge哪些字段包含布尔值?@STA正如我在问题中所说的-大约有60个不同的表具有布尔类型的字段。您不会在此处看到它们,因为$specialFeatures='App\\'。$featureModel每次都会根据装备项目类型更改目标模型。每个模型都有一组不同的列,其中一些列是布尔类型的。我需要一个函数,可以针对任何布尔类型列,然后根据大小写将其值转换为YES/NO,并将其发送到视图。而不是1/0。