无法在 laravel 5.7 中定义关系

Posted

技术标签:

【中文标题】无法在 laravel 5.7 中定义关系【英文标题】:unable to define relationship in laravel 5.7 【发布时间】:2019-02-24 07:17:11 【问题描述】:

我有两个表 sbj_topicsdifficulty_level_sbj_topic 所以,我想定义关系 b\w 他们来获取记录,所以为了建立关系我已经这样做了,

SbjTopic.php:

public function difficulty_level_sbj_topic() 
    return $this->hasMany('App\DiffiLvlSbjTopic');

而在DiffiLvlSbjTopic.php:

protected $table = 'difficulty_level_sbj_topic';
public function sbj_topics() 
    return $this->belongsTo('App\SbjTopic');

之后我将数据返回到视图中:

$easy = DiffiLvlSbjTopic::where(['subject_id' => $id, 'difficulty_level_id' => 2])->get();
return view('diffi_lvls.show', compact('easy'));

然后在视图中我这样做了:

@foreach($easy as $easy)
     $easy->sbj_topics 
@endforeach

但是页面是空白的,当我这样做时 $easy->sbj_topics->sbj_topic_name 试图获得未定义的属性!来了。

创建关系的主要目的是显示主题名称,因为我在difficulty_level_sbj_topic 表中有外键作为sbj_topic_id,所以如果有人有任何其他想法在没有关系的情况下做到这一点会很棒。

【问题讨论】:

这是返回一个集合吗? dd($easy) 是的,它正在返回,但不是关系值 sbj_topic_id 你的 FK 对吗?那么subject_id是什么? $easy = DiffiLvlSbjTopic::where(['subject_id' => $id, 'difficulty_level_id' => 2])->get(); 我有一个 difficulty_level_sbj_topic 表中的另一个字段。 @UsmanDeveloper 一个科目有很多难度级别,还是一个难度级别有很多科目?看看你的关系的顺序。此外,明确提及外键,以便 Laravel 不会自行假设任何内容。 【参考方案1】:

分解:

SbjTopic - 有许多 difflevels 一个 difflevel 属于一个 SbjTopic

有了这种理解,我可以看到您正在获得 difflevels (DiffiLvlSbjTopic)。这实际上是您传递给刀片的内容。

首先:通过指定外键来完成你的关系。 IE: 在 SbjTopics 模型中:

public function difficulty_level_sbj_topic() 
    return $this->hasMany('App\DiffiLvlSbjTopic', 'subject_id');

这样,您就知道在“difficulty_level_sbj_topic”中您必须有subject_id 列。 现在在您的 DiffiLvlSbjTopic 模型中定义反向关系:

public function sbj_topics() 
    return $this->belongsTo('App\SbjTopic', 'subject_id');

所有这些都在您的控制器或路由中就位后,您所需要做的就是获取 DiffLvlSbjTopic 模型属性。例如:

public function index () 
     $easy = DiffiLvlSbjTopic::all();
     return view('diffi_lvls.show', compact('easy'));

终于在你看来:

@foreach($easy as $difflevel)
    <div> $difflevel->sbj_topics->name  </div>
@endforeach

就是这样。

【讨论】:

天啊,太好了,所以我只有一个错误,我没有在反向关系中提供外键。 @UsmanDeveloper 您更大的错误是没有遵循文档中提出的命名约定。通过关注,您将避免 +90% 这种非受迫性错误。 @Tpojka 确实如此,但无论如何指定外键来避免魔法通常都不是坏事。【参考方案2】:

你的两个变量不应该是$easy,它可以是$easy as $easySingle。并在里面添加一个循环

@foreach($easy as $easySingle)
    foreach ($easySingle->sbj_topics as $topic) 
      $topic->property;
       
@endforeach   

【讨论】:

为 foreach() 提供的参数无效 即将出现错误 又是空的兄弟,我觉得关系很乱 再次 为 foreach() 提供的参数无效 错误也随之而来 sbj_topics()

以上是关于无法在 laravel 5.7 中定义关系的主要内容,如果未能解决你的问题,请参考以下文章

API 验证 laravel 5.7

Laravel 5.7 - 如何使用 axios.get 从 API 检索数据?

Laravel 5.7 - 多对多关系 - 选择具有提供的类型 ID 数组的电影

为啥不能在 Laravel 5.7 中捕获我定义的 Route 请求的文件 URI?

无法在工匠自定义命令 Laravel 5.4 中获取模型关系

无法在 php8 上运行 laravel 5.7