简体   繁体   English

如何在 Laravel livewire 中使用 foreach 循环仅访问特定的输入字段?

[英]How can I access only specific input fields using foreach loop in Laravel livewire?

I am a newbie here and using livewire, I'm doing multiple submissions such that user can add many topics and their respective fields.我是这里的新手并使用 livewire,我正在做多个提交,以便用户可以添加许多主题及其各自的字段。 Here is my form:这是我的表格:

@foreach ($topics as $index => $topic )
                <div class="form-column new-form">
                    <h1 class="form-title">Topics </h1>
                    <div class="form-column">
                        <label for="topicname">topic name</label>
                        <input type="url" name="topics[{{$index}}][name]" wire:model="topics.{{$index}}.name" id="topicname" placeholder="Enter topic name">
                    </div>
                    <div class="form-row">
                        <div class="form-column">
                            <label for="coursestatus">status</label>
                            <select name="topics[{{$index}}][status]" id="status" wire:model="topics.{{$index}}.status">
                                <option value="enabled" selected>Enabled</option>
                                <option value="disabled">Disabled</option>
                            </select>
                        </div>
                        <div class="form-column">
                        </div>
                    </div>
                    <div class="form-column">
                        <label for="topicdescription">topic description</label>
                        <textarea name="topics[{{$index}}][description]" wire:model="topics.{{$index}}.description" id="topicdescription" cols="30" rows="10"></textarea>
                    </div>
                    <div class="form-column">
                        <label for="topicdocuments">any documents?</label>
                        <input type="file" name="topics[{{$index}}][document]" wire:model="topics.{{$index}}.document" multiple>
                    </div>
                    <button class="form-submit" wire:click.prevent="removetopic({{ $index }})">Remove topic&nbsp;&nbsp;<i class="bi bi-chevron-right"></i></button>


                </div>
                @endforeach
                <div class="form-row">
                    <button class="form-submit" wire:click.prevent="back">Course&nbsp;&nbsp;<i class="bi bi-chevron-left"></i></button>
                    <button type="submit" class="form-reset"><i class="bi bi-x-lg"></i>&nbsp;&nbsp;Reset</button>
                    <button type="submit" wire:click.prevent="addtopic" class="form-submit"><i class="bi bi-plus-lg"></i>&nbsp;&nbsp;Add This Topic</button>
                    <button class="form-submit" wire:click.prevent="test">Lessons&nbsp;&nbsp;<i class="bi bi-chevron-right"></i></button>
                </div>

I can fetch full array of the form using test function in my livewire component:我可以使用我的 livewire 组件中的测试函数来获取表单的完整数组:

<?php
namespace App\Http\Livewire; 
use Livewire\Component; 
use Illuminate\Support\Facades\DB; 

class Courseupload extends Component
{

public $topics = []

public function mount()
{
    $this->topics = [[
        'name'=>'', 'descrption'=> '', 'status'=> '', 'document'=> ''
    ]];
}


public function addtopic()  
{
    $this->topics[] = ['name'=> '', 'status'=> '', 'description'=>'', 'document'=>''];

}

public function test()
{
   dd($this->topics); 
}
}

Example array Array of multiple forms示例数组多种形式的数组

How can I fetch only specific fields like 'name', 'description' etc. from every form generated?如何从生成的每个表单中仅获取特定字段,例如“名称”、“描述”等?

Thanks.谢谢。

You could convert your array to a collection and then use the pluck method to get the single field you want.您可以将array转换为collection ,然后使用pluck方法获取所需的单个字段。 If you want multiple fields then you can map over each of the elements and use the Arr::only method to return the fields you want.如果您想要多个字段,那么您可以map每个元素并使用Arr::only方法返回您想要的字段。

For example:例如:

$collection = collect([
    ['name' => 'First nane', 'status' => 'First status', 'description' => 'First description', 'document' => 'First document'],
    ['name' => 'Second name', 'status' => 'Second status', 'description' => 'Second description', 'document' => 'Second document']
]);

$singleField = $collection->pluck('name');

$multipleFields = $collection->map(function ($iter) {
    return Arr::only($iter, ['name', 'status']);
});

dd($singleField, $multipleFields);

How the above would differ for you, is you would be using your $this->topics property directly:以上内容对您有何不同,您是否会直接使用$this->topics属性:

$collection = collect($this->topics);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM