Проблема с сохранением значений флажков в базе данных - PullRequest
2 голосов
/ 01 мая 2020

Я пытаюсь сохранить значения своих флажков в базе данных. У меня есть эти три таблицы.

fields

id    name
1     gender
2     looking_for

field_values ​​(здесь field_id ссылается на id таблицы полей)

id    field_id    value    label
1        1          1      Men
2        1          2      Women
3        2          3      Relationship
4        2          4      Friendship
5        2          5      Marriage

user_interests (здесь field_id ссылается на field_id таблицы field_values и value_id ссылается на значение в таблице field_values)

user_id    field_id    value_id
1          1           2
1          2           4
1          2           5

пол в блейде использует значения параметров, а Looking_for использует значения флажков. Я сделал одну функцию, которая пытается обновить их обоих. Я использую два предиката в своей функции, и я могу успешно обновить параметр пола, но я не могу обновить параметр Looking_for. Когда я нажимаю кнопку «Отправить», ничего не происходит, также, когда я сбрасываю что-то внутри этого foreach, которое должно обновлять флажки, оно не сбрасывает. Любая помощь очень ценится. Вот мой код.

web. php

Route::patch('profile/interests', 'UserProfileController@updateInterestsData')->name('profile.update.interests.data');

UserProfileController. php

public function updateInterestsData(UpdateInterestsDataRequest $request)
{
    $user = User::with('userProfile')->where('id', Auth::user()->id)->firstOrFail();

    $request->validated();

    $userId = $request->input('user_id') ? $request->input('user_id') : Auth::user()->id;

    $data = $request->all();
    $options = [
        'gender'         => 1,
        'looking_for'    => 2
    ];

    foreach ($options as $fieldName => $fieldId) {
        if (! empty($data[$fieldName])) {
            DB::table('user_interests')
                ->where('user_id', $userId)
                ->where('field_id', $fieldId)
                ->delete();

            if (is_array($data[$fieldName])) { // CHECKBOX FIELDS AND HERE IT DOESN'T WORK!!!
            //dd('DIE!!!!!!') IT DOESN'T ENTER HERE!!!
                foreach ($data[$fieldName] as $key => $value) {
                    DB::table('user_interests')->insert([
                        'user_id'  => $userId,
                        'field_id' => $fieldId,
                        'value_id' => $value
                    ]);
                }
            } else { // SELECT FIELDS!!!
                DB::table('user_interests')->insert([
                    'user_id'  => $userId,
                    'field_id' => $fieldId,
                    'value_id' => $data[$fieldName]
                ]);
            }
        }
    }

    $user->userProfile->update(
        [
            'age_from_preference' => $request->age_from_preference,
            'age_to_preference' => $request->age_to_preference,
            'updated_at' =>  Carbon::now()
        ]
    );

    $request->user()->save();

    return redirect()->route('profile.show', [$user->username]);
}

index.blade. php

<form action="{{ route('profile.update.interests.data') }}" method="POST" class="flex">
    @method('PATCH')
    @csrf
    <div class="form-group">
        <span>Interessiert an</span>
        {{-- wrong value - selected --}}
        @isset($options)
            @foreach($options as $name => $fieldData)
                @if ($name == 'gender')
                    <div class="selectHolder">
                        <select name="{{ $name }}">
                            <option selected="true" disabled="disabled" value="" style="display:none">bitte auswählen</option>
                            @foreach($fieldData['data'] as $value => $label)
                                <option value="{{ $value }}" {{ isset($data[$fieldData['label']['id']]) ? (in_array($value, $data[$fieldData['label']['id']]) ? 'selected' : '') : '' }}>
                                    {{ $label }}
                                </option>
                            @endforeach
                        </select>
                    </div>
                    <?php
                        unset($options[$name]);
                    ?>
                @endif
            @endforeach
        @endisset
    </div>
    <div class="form-group">
        <span>Im Alter von</span>
        <input type="text" placeholder="XX" maxlength="2" value="{{ $userForShowProfile->userProfile->age_from_preference ?? "" }}" name="age_from_preference">
        <span>Jahren bis</span>
        <input type="text" placeholder="XX" maxlength="2" value="{{ $userForShowProfile->userProfile->age_to_preference ?? "" }}" name="age_to_preference">
        <span>Jahren</span>
    </div>
    {{-- wrong value - checked --}}
    @isset($options)
        <div class="form-group flex mt-5">
            @foreach($options as $name => $fieldData)
                @if ($name == 'looking_for')
                    @foreach ($options[$name]['data'] as $value=>$label)
                        <div class="interestedIn">
                            <input type="checkbox" name="{{ $name.'-'.$value }}" value="{{ $value }}" {{ isset($data[$fieldData['label']['id']]) ? (in_array($value, $data[$fieldData['label']['id']]) ? 'checked' : null) : '' }}>
                            <label for="{{$name}}-{{ $value }}">{{ $label }}</label>
                        </div>
                    @endforeach
                @endif
            @endforeach
        </div>
    @endisset
    <div class="form-group">
        <label for="" class="textBold">Button</label>
        <input type="submit" class="form-control" name="submit" value="BUTTON">
    </div>
</form>

код переменной $ options

public static function getProfileLookingForDisplayOptions()
{
    $options = [
        'gender' => ['id' => 1, 'label' => "Interessiert an"],
        'looking_for' => ['id' => 2, 'label' => ""]
    ];

    $data_options = [];
    foreach ($options as $field => $value) {
        $data_options[$field]['data'] = Value::fieldValues($field);
        $data_options[$field]['label'] = $options[$field];

        if (!in_array($field, ['gender', 'looking_for'])) {
            $data_options[$field]['data'][100] = "Doesn't matter";

        }
    }
    //dd($data_options);
    return $data_options;
}

1 Ответ

1 голос
/ 02 мая 2020

Если я правильно понимаю вашу проблему, чтобы иметь дело с несколькими флажками на PHP, вам нужно добавить [] к его name свойству. Таким образом, PHP знает, что он должен интерпретировать эти значения как массив.

Кроме того, ваше входное имя не совпадает с $data[$fieldName].

Сделайте это так:

    @isset($options)
        <div class="form-group flex mt-5">
            @foreach($options as $name => $fieldData)
                @if ($name == 'looking_for')
                    @foreach ($options[$name]['data'] as $value=>$label)
                        <div class="interestedIn">
                            <input type="checkbox" name="{{ $name }}[]" value="{{ $value }}" {{ isset($data[$fieldData['label']['id']]) ? (in_array($value, $data[$fieldData['label']['id']]) ? 'checked' : null) : '' }} id="{{$name}}-{{ $value }}">
                            <label for="{{$name}}-{{ $value }}">{{ $label }}</label>
                        </div>
                    @endforeach
                @endif
            @endforeach
        </div>
    @endisset
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...