【问题标题】:how to use hasOne for two other detail models in laravel如何在 laravel 中将 hasOne 用于另外两个细节模型
【发布时间】:2021-06-30 03:37:29
【问题描述】:

我有一张主表和两张明细表 表名:tb_main、tb_detail1、tb_detail2

tb_main
id, detail_code
tb_detail1
id, main_id
tb_detail2
id, main_id

我想使用主模型中的一个函数获取详细数据

public function detail()
    {
        if(detail_code == 1)
            return $this->hasOne(Detail1::class, 'main_id', 'id');
        else
            return $this->hasOne(Detail2::class, 'main_id', 'id');
    }

有什么想法吗?请帮我! 对不起,我的英语不好。

【问题讨论】:

  • 如何获取detail_code,这个直接从Auth获取?
  • detail_code 值有 1(对于 tb_detail1)和 2(对于 tb_detail2)
  • @Dream811.also 显示你如何调用关系,detail_code 来自请求或数据库
  • 你现在得到的输出是什么?
  • 尝试 public function detail() { if($this->detail_code == 1) return $this->hasOne(Detail1::class, 'main_id', 'id');否则返回 $this->hasOne(Detail2::class, 'main_id', 'id'); }

标签: database laravel eloquent


【解决方案1】:

您可以使用$this->detail_code

public function detail() { 

if($this->detail_code == 1) {

   return $this->hasOne(Detail1::class, 'main_id', 'id'); 

}else{

   return $this->hasOne(Detail2::class, 'main_id', 'id');

} 

【讨论】:

  • 我再次需要你的帮助。运行此代码后 Main::where('bIsDel', 0)->with('detail');我遇到了这个错误 Call to undefined method Illuminate\Database\Eloquent\Builder::addEagerConstraints() 你能给我一个提示吗?
  • @Dream811 看起来细节不是关系方法。先检查详细退货关系与否
【解决方案2】:

不要在relation 方法中这样做。首先,像这样声明主模型中的所有关系:

public function detail1()
{
   return $this->hasOne(Detail1::class, 'main_id');
}

public function detail2()
{
   return $this->hasOne(Detail2::class, 'main_id');
}

然后根据detail_code写一个方法来决定做什么:

public function detail()
{
    if($this->detail_code == 1)
        return $this->detail1()->first();

    return $this->detail2()->first();
}

【讨论】:

  • 为什么不应该在关系方法中这样做?
  • @Vagabond 从技术上讲,这样做并没有错,但是如果您在一种情况下需要特定的关系怎么办?在此示例中,如果您特别需要 detail1() 怎么办?将关系视为永远不会改变的静态事物。在一些最佳实践中,开发人员使用Repository Pattern 来分离数据获取逻辑和关系。这种模式在 Symfony 中通常用作实体(类似于模型)和存储库(数据获取逻辑和查询)
  • @Vagabond 我忘了说的另一件事是,如果您想使用load('detail') 方法加载关系,这意味着您的模型中没有任何记录数据。那么要获取的数据将是错误的。在此示例中,detail_code 属性将为 null,然后在 load() 方法中,它将始终获取 detail2()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
相关资源
最近更新 更多