Невозможно обновить логическое значение в таблице на vue и laravel - PullRequest
2 голосов
/ 18 апреля 2020

У меня есть логическое поле, когда я пытаюсь обновить значение от false до true для одной или нескольких записей, оно работает, но при попытке обновить его до false оно работает только для первой записи и не может повторить обновление нескольких записей в в то же время без обновления страницы 1 - мой vue компонент, который обрабатывает запрос, выглядит следующим образом:

<template>
<div v-for="(channel, index) in items" :key="channel.id">
<a href="" @click.prevent="toggleVisibility(channel)">
<i v-if="channel.active" class="fas fa-stop default-stop" data-toggle="tooltip" title="Stop Channel"> 
</i>
<i v-else class="fas fa-play" data-toggle="tooltip" title="Start Channel"></i>
</a>
</div>
</template>

export default {
    name: "Channels",
    props: ['allChannels'],
    data() {
        return {
            items: this.allChannels
        }
    },
    methods: {
        toggleVisibility(channel) {
            axios[channel.active ? 'delete' : 'post'](`/visible-channels/${channel.name}`);
        }
    }
}

и мои маршруты:

Route::post('/visible-channels/{channel}', 'ChannelsController@activate');
Route::delete('/visible-channels/{channel}', 'ChannelsController@deactivate');

мой контроллер:

public function activate(Channel $channel, Request $request)
{
    if ($request->method() == 'POST') {
        $channel->update(['active' => true]);
    }
    return back();
}

public function deactivate(Channel $channel, Request $request)
{
    if ($request->method() == 'DELETE') {
        $channel->update(['active' => false]);
    }
}

Модель

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

class Channel extends Model
{
protected $guarded = [];

protected $casts = [
    'active' => 'boolean',
];

protected static function boot()
{
    parent::boot(); 

    static::updating(function () {
        return Cache::forget('activeChannels');
    });
}

public function getRouteKeyName()
{
    return 'name';
}
}

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

Поскольку laravel хранит логические значения как 1 и 0 в базе данных, вам, вероятно, следует установить для свойства active значение boolean в вашей модели

Это потому, что laravel обрабатывает false как строка, поэтому, когда для active установлено значение false, она сравнивается с 'false' == true, равным true, поэтому в базе данных сохраняется 1.

class Channel extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'active' => 'boolean',
    ];
}
0 голосов
/ 19 апреля 2020

Я понял, просто изменив функцию загрузки, чтобы дождаться окончания обновления sh

 static::updated(function () {
    return Cache::forget('activeChannels');
});
...