如何将 in_array 与 belongsToMany 关系一起使用?

How to use in_array with belongsToMany relationships?

我将 belongsToMany 与模型 Riskarea 一起使用,因为我有一个名为 riskarea_fields 的枢轴 table,它将 Riskfield 模型加入 Riskarea:

class Riskarea extends Model
{
    use SoftDeletes;

    protected $table = 'riskareas';
    protected $fillable = [
        'name',
        'icon',
    ];

    public function riskfields()
    {
        return $this->belongsToMany(
            Riskfield::class,
            'riskarea_fields',
            'area_id',
            'field_id'
        );
    }
}

在我的edit.blade.php中我有这个代码:

@foreach ($riskfields as $rf)
    <option value="{{ $rf->id }}" @if (old('active', in_array($riskarea->riskfields, $rf->id))) selected="selected" @endif>
        {{ $rf->name }}
    </option>
@endforeach

我想要做的是遍历 riskfields 属性 和 select riskarea->riskfields.

中的所有风险域选项

不幸的是我得到了:

in_array(): Argument #2 ($haystack) must be of type array, int given

这是我的编辑方法:

public function edit(Riskarea $riskarea)
{
    return view('riskareas.edit', [
        'riskarea' => $riskarea,
        'riskfields' => Riskfield::all()
    ]);
}

有什么想法吗?

你犯了一个小错误。您错误地使用了 in_array() 函数。语法是:in_array(mixed $needle, array $haystack)。你弄反了。要使用 in_array 函数,您还需要一个数组。因此,您将 collection 转换为数组。您可以使用 Laravel 函数 toArray() 执行此操作。 https://laravel.com/docs/8.x/collections#method-toarray。 在您的 blade 文件中将其更改为:

in_array($riskarea->riskfields, $rf->id)

in_array($rf->id, $riskarea->riskfields->toArray())).

in_array(mixed $needle, array $haystack, bool $strict = false): bool https://www.php.net/manual/de/function.in-array.php

由于您想检查每个 ID 是否存在于关联的风险字段中,因此请事先提取它们的 ID。

public function edit(Riskarea $riskarea)
{
    return view('riskareas.edit', [
        'riskarea' => $riskarea,
        'selectedRiskfieldIds' => $riskarea->riskfields()->pluck('id')->toArray(),
        'riskfields' => Riskfield::all(),
    ]);
}

那你可以做

@foreach ($riskfields as $rf)
    <option value="{{ $rf->id }}" @if (old('active', in_array($rf->id, $selectedRiskfieldIds))) selected="selected" @endif>
        {{ $rf->name }}
    </option>
@endforeach