【问题标题】:Laravel Relation in multiple table多表中的Laravel关系
【发布时间】:2017-02-21 11:53:51
【问题描述】:

我有 3 个如下表。

表 A

id  | val_a
1   | a1
2   | a2
3   | a3

表 B

id  | id_a| val_b | id_c
1   | 2   | b1    |  1
2   | 2   | b2    |  3
3   | 3   | b3    |  4

表 C

id  | val_c
1   | c1
2   | c2
3   | c3
4   | c4

获取如下数据的最佳方法是什么:

 [
[0] => stdClass Object
    (
        [id_a] => 1
        [val_a] => 'a1'
    )
[1] => stdClass Object
    (
        [id_a] => 2
        [val_a] => 'a2'
        [table_b_c] => Array
            (
                [0] => stdClass Object
                    (
                        [id_b] => 1
                        [val_b] => 'b1'
                        [id_c] => 1
                        [val_c] => 'c1'
                    )

                [1] => stdClass Object
                     (
                        [id_b] => 2
                        [val_b] => 'b2'
                        [id_c] => 3
                        [val_c] => 'c3'
                     )
            )
    )
    [2] => stdClass Object
    (
        [id_a] => 3
        [val_a] => 'a3'
        [table_b] => Array
            (
                [0] => stdClass Object
                    (
                        [id_b] => 3
                        [val_b] => 'b3'
                        [id_c] => 4
                        [val_c] => 'c4'
                    )
            )
    )
]

TableA 模型

class TableA extends Model {

    public function getTableA($id_a) {
        return $this->where('id', $id_a)->with('TableB', 'TableC')->get()->toArray();
    }
}

表 B 的模型

class TableB extends Model {

    public function tableA(){
        $this->belongsTo('App\tableA'); 
    }

    public function tableC(){
       $this->belongsTo('App\tableC'); 
    }

}

TableC 模型

class TableC extends Model {
}

我已经尝试过上述关系,但它对我不起作用。

我正在使用Laravel 5.2。并通过 foreach 循环实现这一点。但我不知道最好的方法是什么。我可以通过 laravel 或 Mysql 做到这一点吗?提前谢谢。

【问题讨论】:

  • 关系出了什么问题?
  • 您的模型似乎是错误的。 B 型应该有$this->belongsTo('App\ModelA', 'id_a');$this->belongsTo('App\ModelC', 'id_c'); 功能。模型 A 中的第二个函数应该在模型 C 中。然后循环使用 $a->tableBs()
  • @Martin Henriksen 我与“id_a not found in TableC”的关系
  • @louisav 我已经在 tableB 中创建了这两个函数,但是如何关联呢?
  • 你的 hasMany 关系更喜欢复数函数名。请用您的新模型更改更新问题。

标签: php mysql laravel laravel-5.2


【解决方案1】:

我已经设置了一些数据并使用this documentation 返回一个嵌套对象。

您的模型函数名称必须正确标记,这样才能正常工作:

$data = TableA::with(['recordsB.recordC'])->get();
dd($data->toArray());

这意味着将获取所有 TableA 记录,然后添加与每个 A 记录相关的表 B 中的所有记录。只要模型中的函数名是recordsB。 dot 语法然后添加来自表 C 的嵌套和相关记录(对于每个 B 记录),再次给出正确的函数名称。请参阅文档中的“嵌套急切加载”。

您描述的数据似乎不适用于特定的 A 记录。所以最好在控制器中预先加载。出于这个原因,我从getTableA 函数中删除了 id 参数。

在模型中 - 模型 TableA:

class TableA extends Model {

  public function getTableA() {
    $data = TableA::with(['recordsB.recordC'])->get();
    return $data;
  }

  public function recordsB(){
    $this->hasMany('App\TableB'); 
  }
}

模型表B:

class TableB extends Model {
   public function recordA(){
      $this->belongsTo('App\TableA'); 
   }

   public function recordC(){
      $this->belongsTo('App\TableC'); 
   }
}

模型表C:

class TableC extends Model {
   public function recordsB(){
      $this->hasMany('App\TableB'); 
   }
}

【讨论】:

  • 实际上我正在为 angularjs 创建服务。所以我没有刀片页面。请仅作为 api 回答
  • 您更新的答案未返回所需的结果。它在单独的数组字段中返回 tableB 和 tableC。
  • 在表 B 中,您没有重复 id_c。请澄清关系。每个 C 记录有很多 B 记录吗?
  • 能否请您在模型中为上述答案编写函数。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多