【问题标题】:Laravel - why is a Model's relations not being loaded?Laravel - 为什么没有加载模型的关系?
【发布时间】:2019-09-20 18:00:34
【问题描述】:

我有一个 Laravel 5.3 站点,我想我可能会因为 API 控制器中发生的一些操作和常规控制器中发生的一些操作而发生一些奇怪的事情。

或者可能是我有时处理模型,有时处理 Eloquent 集合的问题。

问题是,我正在尝试检索模型上的关系并且结果为空。

例如,我有与week 模型相关的course 模型。

在course 模型中,我得到week 项目

  public function weeks()
    {

        return $this->hasMany(Week::class, 'course_id');

    }

在后端,这些关系以这种方式发送:

$course->load('weeks')

一切都好。

但是当course 项目被删除并且我尝试在week 控制器中采取行动时

        static::deleting(function($course) { 
            $course->weeks->delete();
        });

$course->weeks 为空。当时我在数据库中看到一切都很好,这个course 项目确实有一个week 项目相关,但$course 显示0 关系。

所以在$course->webinars 没有抓取week 相关项目的情况下发生了一些奇怪的事情。

我从根本上做错了什么吗?也许是因为在模型中我有这些陈述:

protected $table = 'Week';

这些是否阻止了关系被拉动?我一直认为我在模型中有一些函数可以返回关系,当我使用语法 $course->weeks 时,这些关系总是可用的。

想法?

再次感谢,

【问题讨论】:

    标签: laravel


    【解决方案1】:

    如果您有外键关系,您可以简单地将迁移设置为在删除课程时自动从几周内删除。

    如果您在周表中有一个 course_id 列,则将其添加到您的迁移中

    $table->foreign('course_id')
          ->references('id')->on('courses')
          ->onDelete('cascade')
    
    

    【讨论】:

    • 是的,事情就是这样设置的,但这让我很难在被级联删除的项目上触发删除事件。
    【解决方案2】:

    我认为你可以使用观察者。在您的 AppServiceProvider 中,首先注册观察者。

    public function boot()
    {
         Course::observe(CourseObserver::class);
    }
    
    Now, add an Observer class.
    
    class CourseObserver
    {
        public function deleting(Course $course)
        {
             $course->weeks()->delete();
        }
    } 
    
    

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2021-07-19
      • 2017-07-26
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      相关资源
      最近更新 更多