为什么删除相关行 boot() 中的行不会被触发?

2024-04-18

在我的 Laravel 5.7 应用程序中,我有 2 个表 Tag,TagDetail(一对一关系),第二个表将图像上传到存储和图像字段。 我想使用引导方法自动删除相关行和图像。结果删除与 TagDetail 相关的 Tag 行被删除,但 TagDetail 的图像 没有被删除。 我有 2 个模型, new Tag())->d( 只是调试功能 应用程序/Tag.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

use DB;
use App\MyAppModel;
use App\TagDetail;
use App\Http\Traits\funcsTrait;
use Illuminate\Validation\Rule;
use App\Rules\TagUniqueness;


class Tag extends MyAppModel
{
    use funcsTrait;

    protected $table = 'tags';

    protected $primaryKey = 'id';
    public $timestamps = false;
    private $votes_tag_type= 'votesTagType';

    public function getTableName() : string
    {
        return $this->table;
    }

    public function getPrimaryKey() : string
    {
        return $this->primaryKey;
    }

    public function tagDetail()
    {
        return $this->hasOne('App\TagDetail', 'tag_id', 'id');
    }

    protected static function boot() {
        parent::boot();
        static::deleting(function($tag) {
            with (new Tag())->d( '<pre>Tag BOOT $tag::' . $tag->id);
            $relatedTagDetail= $tag->tagDetail();
            if ( !empty($relatedTagDetail) ) {
                $relatedTagDetail->delete();  // I see this is triggered and  relatedTagDetail is deleted 
            }
        });
    }

和 app/TagDetail.php :

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use DB;
use App\MyAppModel;
use App\library\ImagePreviewSize;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use App\Http\Traits\funcsTrait;

class TagDetail extends MyAppModel
{
    use Notifiable;
    use funcsTrait;

    protected $table = 'tag_details';
    protected $primaryKey = 'id';
    public $timestamps = false;

    protected $fillable = [
        'tag_id',
        'image',
        'description',
    ];

    public function getTableName() : string
    {
        return $this->table;
    }

    public function getPrimaryKey() : string
    {
        return $this->primaryKey;
    }

    public function Tag()
    {
        return $this->belongsTo('App\Tag', 'tag_id');
    }


    protected static function boot() {
        parent::boot();
        static::deleting(function($tagDetail) { // THIS METHOD IS NOT TRIGGERED AT ALL!
            with (new TagDetail())->d( '<pre>TagDetail BOOT $tagDetail::' . $tagDetail->id);

            $tag_detail_image_path= TagDetail::getTagDetailImagePath($tagDetail->id, $tagDetail->image, true);
            with (new TagDetail())->d( '<pre>TagDetail BOOT $tag_detail_image_path::' . $tag_detail_image_path);
            TagDetail::deleteFileByPath($tag_detail_image_path, true);
        });
    }

我的模型声明有问题吗?

修改块#2: 在我包含的文件 public/js/defaultBS41Backend/admin/tag.js 中,我有方法:

backendTag.prototype.deleteTag = function (id, name) {
    confirmMsg('Do you want to delete "' + name + '" tag with all related data ?', function () {
            var href = this_backend_home_url + "/admin/tag/destroy";

            $.ajax({
                type: "DELETE",
                dataType: "json",
                url: href,
                data: {"id": id, "_token": this_csrf_token},
                success: function (response) {
                    $("#btn_run_search").click()
                },
                error: function (error) {
                    alertMsg(error.responseJSON.message, 'Tag deleting error!', 'OK', 'fa fa-exclamation-triangle')
                }
            });

        }
    );

} // backendTag.prototype.deleteTag = function ( id, name ) {

并在控制中:

public function destroy(Request $request)
{
    $id  = $request->get('id');
    $tag = MyTag::find($id);

    if ($tag == null) {
        return response()->json(['error_code' => 11, 'message' => 'Tag # "' . $id . '" not found!', 'tag' => null],
            HTTP_RESPONSE_INTERNAL_SERVER_ERROR); //500
    }

    DB::beginTransaction();
    try {
        $tag->delete();
        DB::commit();

    } catch (Exception $e) {
        DB::rollBack();

        return response()->json(['error_code' => 1, 'message' => $e->getMessage(), 'tag' => null], HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
    }

    return response()->json(['error_code' => 0, 'message' => ''], HTTP_RESPONSE_OK_RESOURCE_DELETED); // 204
} //     public function delete(Request $request)

在routes/web.php中:

Route::group(['middleware' => ['auth', 'isVerified'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::delete('/tag/destroy', 'Admin\TagsController@destroy');
    ...

问题是$tag->tagDetail():您正在使用查询生成器并直接在数据库中删除模型。但是deleting仅当您首先检索模型时才能触发事件。

Replace $relatedTagDetail = $tag->tagDetail(); with $relatedTagDetail= $tag->tagDetail;.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么删除相关行 boot() 中的行不会被触发? 的相关文章

随机推荐

  • 我的服务应该返回什么接口? IQueryable、IList、IEnumerable?

    想象一下 我有一个 SearchService 层 它有一个方法来搜索以某个字符串开头的所有汽车 public static class Searcher public IAnInterface
  • 如何在 Safari 上提供 ES6 模块?

    我有一个关于 Safari 中 ES6 模块使用的问题 这让我抓狂 因为它阻止我与 Safari 用户共享我的网站 我的网络应用程序和即将推出的 MWE工作得很好在以下环境中 Windows Chrome Edge 和 Firefox 均通
  • 适用于 Objective C iPhone 的 XMLStreamReader?

    我在用XML编写器 http code google com p xswi 用于生成 xml 现在我想用一些阅读器库 框架来阅读这个 xml 是否有任何可用的补充框架 库 我目前正在寻找使用 TouchXML 库来读取此内容 但它无法按预期
  • “mov offset(%rip),%rax”有什么作用?

    Does rax获取偏移量加上这条指令的地址 还是下一条指令的地址 从微代码的角度来看 如果答案是下一条指令可能会更容易 下一个 这是 x86 上的一般规则 另请参阅分支 在 Intel 手册第 2 卷第 2 2 1 6 RIP 相对寻址部
  • Sprite Kit 物理碰撞问题

    我遇到了一些碰撞问题 我有两个大小和质量相同的物体 当一个物体与另一个静止物体碰撞时 我会得到正确的行为 图像中的灰色区域 当我有两个彼此相邻的对象时 行为不太正确 Spritekit 结果在左侧 右侧是预期 需要的结果 我想我知道发生了什
  • 两个字段的 sqlalchemy 验证器

    SQLAlchemy 文档解释了如何使用 validates 装饰器向模型添加验证 from sqlalchemy orm import validates class EmailAddress Base tablename address
  • Vagrant:* 未知的配置部分“disksize”

    在我的机器上配置 Vagrant 环境期间 我收到了以下消息 流浪汉 未知的配置部分 disksize 它是在插件安装后显示的 这里是vagrantfile mode ruby vi set ft ruby All Vagrant conf
  • 如何调试SocketTimeoutException?

    我们正在得到一个java net SocketTimeoutException当客户端 A 连接到服务器 B 时 在服务器 B 上 不知道为什么 客户端正在向服务器发送数据 然后服务器抛出此异常 如何解决这个问题 请注意 目前这种情况只发生
  • 在特定单元格之后停止执行 Databricks 笔记本

    我在 Databricks 笔记本上尝试了 sys exit 0 Python 代码 和 dbutils notebook exit 但这两个选项都不起作用 请建议任何其他方法来停止 Databricks 笔记本中特定单元格之后的代码执行
  • 有什么方法(或快捷方式)可以像在 Eclipse 中一样自动导入 IntelliJ IDEA 中的类吗?

    In Eclipse while coding in Java and press Ctrl Shift O auto import all the Classes automatically In NetBeans this is don
  • 在页面加载时从 JSP 文件调用 servlet

    我可以在不使用 HTML 表单的情况下从 JSP 文件调用 servlet 吗 例如 在页面加载期间在 HTML 表中显示数据库的结果 您可以使用doGet http docs oracle com javaee 7 api javax s
  • 如何让 Eclipse 显示 javax 注释的 Javadoc

    我真的很喜欢 Eclipse 为我使用的各种 Java 库类提供弹出式 Javadoc 文档的方式 不过 我也使用 JPA 和 JAXB 注释 例如 Entity 和 XMLType Eclipse 认为这些是有效的 因为我可以按 ctrl
  • HTTPResponse 对象 -- JSON 对象必须是 str,而不是“字节”

    我一直在尝试更新一个名为的小型 Python 库libpynexmo https github com marcuz libpynexmo使用 Python 3 我一直被这个功能困住了 def send request json self
  • 创建一个临时表并从中选择

    当我运行此命令时 出现错误 未声明的变量 temp
  • 调整组件大小时 JPanel 闪烁

    首先 我想澄清一下 我知道这个问题已经被问过很多次了 但是 我还没有找到对我有用的答案 我正在尝试制作一款需要分辨率的游戏 因此 我开始工作 使一个组件适应另一个组件的大小 同时保持纵横比 但我遇到了一个问题 那就是对象会发生某种轻弹或调整
  • 如何在 WebdriverIO 中单击 CTRL+M (Control + M)

    我必须发出一个CTRL MWebdriverIO 中的操作 但它不起作用 我尝试过使用不同的方法 例如 browser keys Control keys m browser keys Control KeyM NULL browser k
  • 如何为 HDFS 递归列出子目录?

    我在 HDFS 中递归创建了一组目录 如何列出所有目录 对于普通的 UNIX 文件系统 我可以使用以下命令来做到这一点 find path type d print 但我想为 HDFS 得到类似的东西 递归列出目录内容hadoop dfs
  • 仅绘制 y 轴,不绘制其他内容

    我想创建一个仅显示 y 轴 包括网格 数字和标签 的图 但我不想显示绘图或 x 轴 这可以吗 创建绘图时 您只需指定一些选项 特别要注意的是axes type and xlab plot runif 10 runif 10 xlim c 0
  • 如何在java中使用gson解码json字符串?

    我有一个json字符串 社交网络Qaiku的流 我怎样才能用Java解码它 我已经搜索过 但任何结果都对我有用 谢谢 对象反序列化的标准方法如下 Gson gson new Gson MyType obj gson fromJson jso
  • 为什么删除相关行 boot() 中的行不会被触发?

    在我的 Laravel 5 7 应用程序中 我有 2 个表 Tag TagDetail 一对一关系 第二个表将图像上传到存储和图像字段 我想使用引导方法自动删除相关行和图像 结果删除与 TagDetail 相关的 Tag 行被删除 但 Ta