#laravel
#laravel
Вопрос:
Это light
таблица моего участника
0 означает отсутствие света, 1 означает, что свет включен
|id| sx_ID | gylight|
---------------------
|1 |SX00001| 0 |
|2 |SX00002| 1 |
|3 |SX00003| 1 |
---------------------
Это моя gylight
таблица
Когда участник покупает источник света, он сохраняет sx_ID
и другое значение в gylight
таблице. Далее, один участник может купить более одного источника света.
|id| sx_ID | gylight_number|
----------------------------
|1 |SX00002| A1 |
|2 |SX00002| A15 |
|3 |SX00003| A78 |
----------------------------
Это мой контроллер функции удаления
Когда администратор удаляет неправильную запись или старую запись, gylight
столбец в light
таблице должен быть обновлен 0
. Но это кодирование приведет gylight
к прямому превращению 0
, даже если у участника все еще был другой свет. Как я могу написать код для проверки таблицы light sx_ID
, имеет ли она значение sx_ID
in the gylight
table или другие методы.
public function del(Request $request)
{
Guanyin::find($request->id)->delete();
Light::where('sx_ID','=',$request->sx_ID)
->update(['gylight' => 0]);
return response()->json();
}
Ответ №1:
Если вы используете Eloquent, попробуйте это:
Легкая модель
public function guanyins()
{
return $this->hasMany(Guanyin::class, 'sx_ID')
}
Модель Гуаньинь
public function light()
{
return $this->belongsTo(Light::class, 'sx_ID');
}
Контроллер Guanyin
public function del(Request $request)
{
Guanyin::find($request->id)->delete();
Light::where('sx_ID', '=', $request->sx_ID)
->whereDoesntHave('guanyins')
->update(['gylight' => 0]);
return response()->json();
}
Комментарии:
1. Похоже, что этот код не работает в моем коде, когда я пытаюсь удалить весь результат SX00002 в
gylight
таблице, но вlight
таблицеgylight
нет обновления2. @JeremyYx Моя ошибка, если использовать whereDoesntHave(), что означает, что нет Гуаньинь, можно найти по sx_ID легкого результата.
3. это работает! Но
light
модель должна бытьreturn $this->hasMany(Guanyin::class, 'sx_ID', 'sx_ID');
Ответ №2:
Вы можете использовать Observer, чтобы сделать это автоматически, поэтому вам не нужно делать это вручную, он автоматически обновит индикатор всякий раз, когда Гуаньинь был удален
Легкая модель
public function guanyins()
{
return $this->hasMany(Guanyin::class, 'sx_ID')
}
GuanyinModel
use AppObserversGuanyinObserver;
public function light()
{
return $this->belongsTo(Light::class, 'sx_ID');
}
public static function boot()
{
parent::boot();
Guanyin::observe(GuanyinObserver::class);
}
GuayinController
public function delete(Request $request)
{
$guanyin = Guanyin::findOrFail($request->id);
$guanyin->delete();
return response()->json();
}
И для создания наблюдателя вы можете выполнить эту команду:
php artisan make:observer GuanyinObserver --model=Guanyin
ссылка : https://laravel.com/docs/8.x/eloquent#observers
GuanyinObserver и ваш код наблюдателя будут выглядеть следующим образом:
<?php
namespace AppObservers;
use AppGuanyin;
class GuanyinObserver
{
/**
* Handle the guanyin "deleted" event.
*
* @param AppGuanyin $guanyin
* @return void
*/
public function deleted(Guanyin $guanyin)
{
$light = $guanyin->light;
if($light->guanyins->count() == 0) {
$light->gylight = 0;
$light->update();
}
}
}
и все готово, теперь всякий раз, когда гуаньинь удаляется, он автоматически проверяет наличие света, подсчитывает его гуаньинь, если count равно 0, он переключает подсветку на 0
. вы также можете применить это к созданному методу в observer, чтобы изменять подсветку на 1 при создании гуаньинь
Комментарии:
1. Привет, я пытаюсь использовать эту кодировку, но вижу, что она не работает. Поскольку я все еще новичок в laravel, возможно, я недостаточно хорошо знаю эту часть
2. @JeremyYx пожалуйста, обратитесь к правке, которую я сделал выше в коде GuanyinModel