如何检查数据库PHP Laravel中存在的复选框数组值?

Posted

技术标签:

【中文标题】如何检查数据库PHP Laravel中存在的复选框数组值?【英文标题】:How to check checkbox array values exist from database PHP Laravel? 【发布时间】:2020-06-04 08:12:52 【问题描述】:

我想检查国家/地区中是否存在这些国家,并且将显示该复选框。这些值直接来自数据库。我无法在输入处设置值,因为它是数组/多个值。所以,我想检查每个数组,使它成为一个复选框。

控制器:

public function edit($id)

    $region = Region::find($id);
    $countries = Country::all();
    $country_region = DB::table('regions')
        ->select('countries.id', 'countries.name')
        ->join('country_region', 'regions.id', '=', 'country_region.region_id')
        ->join('countries', 'country_region.country_id', '=', 'countries.id')
        ->where('regions.id', '=', $id)
        ->get();

    $items = array(
        'region' => $region,
        'countries' => $countries,
        'country_region' => $country_region,
    );

    return view('admin.region.edit')->with($items);

刀片

<div class="form-group">
    <label>Choose Country</label>
    <select id="test" type="checkbox" name="country_id[]">
        @foreach ($countries as $item)
        <option value="$item->id" selected @if (in_array($item->id, array_keys($country_region))) checked="checked"
            @endif>$item->name
        </option>
        @endforeach
    </select>
</div>

如您所见,我将 php 语句放入刀片中以检查国家/地区是否存在 $country_region。我得到了与数组相关的错误,如下所示:

array_keys() expects parameter 1 to be array, object given 

数据库:

国家地区表:

区域表:

国家表:

【问题讨论】:

$item-&gt;id 是一个对象,但你把它放在 in_array() 方法上 因为 $item->id 也是 $country_region 中的一个数组。 @Moshiur 您是否要选择一个选项?那你为什么要添加检查属性?它在复选框中使用,但您在选择框中使用它 我之前已经使用过复选框但仍然无法使用 您必须将其添加到选择框之外 【参考方案1】:

在查询中使用pluck 而不是select

$country_region = DB::table('regions') 
     ->join('country_region', 'regions.id', '=', 'country_region.region_id')
     ->join('countries', 'country_region.country_id', '=', 'countries.id')
     ->where('regions.id', '=', $id)
     ->get()
     ->pluck('countries.name', 'countries.id');

【讨论】:

为什么我必须使用 pluck 而不是 select? 你已经使用了 in_array 这就是你需要一个数组来比较值并且 pluck 方法返回一个数组的原因【参考方案2】:

我认为您不需要像in_array 这样的数组函数,因为您已经在循环每个国家/地区,简单的如果应该可以工作,还请显示您要比较的表格的内容。

<div class="form-group">
    <label>Choose Country</label>
    <select id="test" type="checkbox" name="country_id[]">
        @foreach ($countries as $item)
        <option value="$item->id" selected @if ($item->id == $country_region.country.id) checked="checked"
            @endif>$item->name
        </option>
        @endforeach
    </select>
</div>

【讨论】:

表格的内容是什么意思?你是说数据库吗? 是的,CountryCountry_Region等表格的内容【参考方案3】:

$country_region 不是控制器中的数组。这是Eloquent collection。要将其更改为数组,您只需在其上使用toArray()

在你的控制器中,替换这个:

$items = array(
            'region' => $region,
            'countries' => $countries,
            'country_region' => $country_region,
    );

用这个:

$items = array(
            'region' => $region,
            'countries' => $countries,
            'country_region' => $country_region->toArray(),
    );

【讨论】:

@asad 更新了我的答案。【参考方案4】:

使用 pluck 获取数组中所有国家/地区的 id

$country_region = DB::table('regions')
    ->join('country_region', 'regions.id', '=', 'country_region.region_id')
    ->join('countries', 'country_region.country_id', '=', 'countries.id')
    ->where('regions.id', '=', $id)
    ->pluck('country_region.id')
    ->toArray();

那就不要再使用array_keys()了。像这样修改你的 html

<option value="$item->id" selected @if (in_array($item->id, $country_region)) checked="checked"
    @endif>$item->name
</option>

【讨论】:

【参考方案5】:

确保 $country_region 是一个数组

【讨论】:

这个说法更适合cmets,不适合答案。请详细说明。

以上是关于如何检查数据库PHP Laravel中存在的复选框数组值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新页面 LARAVEL PHP SQL 的情况下插入复选框表?

如何检查输入复选框数据表laravel?

我想使用 laravel 8 mvc 从一个复选框中检查我的所有复选框

检查某个类别中是不是存在帖子不起作用。 php,刀片,Laravel

如何使用 Ajax、PHP 和 JQuery 检查多个输入复选框?

使用 laravel 和 vue js 从 mysql 数据库中检查带有逗号分隔值的复选框