Php 如何在Laravel 7中查询列类型并检索布尔值?
是否有一种方法可以判断给定数据库表中的某一列的类型为“boolean”,如果是,则将“0”或“1”转换为“No”和“Yes” 我有一个名为“gearitems”的表,其中包含了有关徒步旅行装备项目的基本信息(如价格、重量、描述等),然后我还有近60个其他“一对一”关系表(例如:“背包”、“睡袋”、“帐篷”),根据装备的类型,这些表都有特定的“特殊功能”。例如,如果它是一个背包,它的容量以升为单位,但是如果它是一个帐篷,它需要的木桩数量等等 我遇到的问题是,这些小型“特殊功能”表中有许多具有不同名称的布尔型列(如“背包”中的“防水”或“睡袋”中的“可附加”),当我想向用户显示特定的齿轮部件时,我有一个将连接常规“齿轮项目”的函数表至相应的特定齿轮类型表 对于所有列类型,在数据插入数据库时显示数据没有问题,但是布尔值返回“1”或“0”。。。我不能将所有的“1”和“0”都转换为“是”或“否”,因为其他值可能是1或0,它们不是布尔值。所以我想,如果我可以检查列类型是否为布尔类型数据,那么我就可以安全地将值转换为yes或no,但是如果不专门针对列的名称,我怎么做呢?(因为所有布尔类型列的列表太长,将来很难编辑) 我已经创建了一个名为“specialfeatures”的表格,其中包含了每种装备类型(“背包”、“sllepingbags”等)的每个表格中所有特殊功能的名称(如“防水”、“所需木桩”、“容量”等)“在special_features_name列旁边,指示该功能是否为布尔值,但这似乎是一种非常粗糙和不优雅的方式。肯定有更好的办法吗 如果有帮助,以下是我的代码中的相关部分: 我的控制器:Php 如何在Laravel 7中查询列类型并检索布尔值?,php,mysql,eloquent,laravel-7,Php,Mysql,Eloquent,Laravel 7,是否有一种方法可以判断给定数据库表中的某一列的类型为“boolean”,如果是,则将“0”或“1”转换为“No”和“Yes” 我有一个名为“gearitems”的表,其中包含了有关徒步旅行装备项目的基本信息(如价格、重量、描述等),然后我还有近60个其他“一对一”关系表(例如:“背包”、“睡袋”、“帐篷”),根据装备的类型,这些表都有特定的“特殊功能”。例如,如果它是一个背包,它的容量以升为单位,但是如果它是一个帐篷,它需要的木桩数量等等 我遇到的问题是,这些小型“特殊功能”表中有许多具有不同名
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。