Laravel多级关联场景下如何从ArticleBlockImage获取父级Article的ID
错误原因
你遇到的报错是因为在模型实例方法内调用关联方法时,没有基于当前实例$this调用,而是将article_block_images()当做全局函数调用,自然找不到对应定义。同时原写法的关联调用逻辑、查询方法选择也存在错误。
正确实现方式
你当前处于ArticleBlockImage模型的方法中,当前实例就是$this,直接基于实例逐层调用关联即可,推荐两种写法:
写法1:动态关联属性(最简便)
Laravel的动态关联属性会自动解析关联返回对应的模型实例,无需手动调用查询构造器:
// 直接在ArticleBlockImage的方法内写即可 $article = $this->article_block->article; $articleId = $article->id;
写法2:关联查询构造器写法
如果你需要在关联查询中加额外条件,可以用这种写法,注意取单个关联模型用first()而非返回集合的get():
$article = $this->article_block()->article()->first(); $articleId = $article->id;
优化方案:追加直通关联
你可以在ArticleBlockImage中定义hasOneThrough直通关联,后续无需逐层调用即可直接拿到所属Article:
// 在ArticleBlockImage模型中追加此关联定义 public function article() { return $this->hasOneThrough( Article::class, ArticleBlock::class, 'id', // ArticleBlock表关联Article的外键字段名 'id', // Article表的主键字段名 'article_block_id', // 当前ArticleBlockImage表关联ArticleBlock的外键字段名 'article_id' // ArticleBlock表关联Article的外键字段名 ); }
定义完成后直接调用即可:
$articleId = $this->article->id;
内容的提问来源于stack exchange,提问作者chu
相关产品推荐
相关产品推荐

