php 对象上的值时,试图读取数组“”上的属性“id”< select>

xuo3flqw  于 2023-06-20  发布在  PHP
关注(0)|答案(1)|浏览(164)

我有这个错误使用livewire和我真的不明白有什么问题
在类中,我声明了一个$dominio_id公共变量,我的组件将绑定到该变量。我还有一个$dominios变量,我从Dominio模型中获取数据,就像...

class Software extends Component {
  public $dominio_id, $dominios; 
  ...

  public function mount() {
    $this->dominios = Dominio::orderBy('name')->get();
    $this->dominio_id = 1;
    ...
  }
}

在blade中,我有以下内容:

<select wire:model="dominio_id">
    @foreach ($dominios as $d)
        <option value="{{ $d->id }}">{{ $d->path }}</option>
    @endforeach
</select>

它呈现得很好,如果我将dominio_id更改为表中的任何id,它都会被选中,所以没有问题。现在,当我选择一个不同的值时,它会抛出错误:Attempt to read property "id" on array跟踪表明问题在这里:

<option value="{{ $d->id }}">{{ $d->path }}</option>

如果我取出wire:model,问题就消失了,但当然我不能绑定select
我做过很多次同样的事情,从来没有遇到过这种错误。
我也试过,虽然我知道不需要添加$rules var:

protected $rules = [
  'dominio_id' => 'required',
];

但也不管用。
如果我使用inspect工具,我看到select - option良好:
你知道吗?

tpxzln5u

tpxzln5u1#

你有两个选择来解决这个问题(这两个选项中的一个就足够了):
1:从mount()中删除$this->dominios,并添加到render()中,如下所示:

public function render(){
$dominios = Dominio::orderBy('name')->get();
return view('your-view',compact('dominios'));
}

2:在你的blade中你必须使用array而不是collection,像这样:

<select wire:model="dominio_id">
    @foreach ($dominios as $d)
        <option value="{{ $d['id'] }}">{{ $d['path'] }}</option>
    @endforeach
</select>

原因是livewire不能通过集合类型传递参数到视图(因为js不能渲染),所以当你在mount()中使用集合时,livewire在下一个请求中将集合转换为数组。

相关问题