首页 > 解决方案 > AngularJS 和 Laravel 4.2 从多个表中检索数据并加入它们

问题描述

我最近开始使用 Laravel,最近才得到帮助,可以从一个控制器将数据插入到多个表中。现在,我正在尝试从数据库中检索数据并在需要编辑或有人需要查看数据以确认数据是否正确时填充表单。我不明白我是如何加入表格的,这是在 Laravel 的模型中吗?还是我必须创建一个连接 SQL 查询?

Travelbill.php 模型

<?php

  class Travelbill extends Eloquent {

    protected $table = 'travelbill';
    protected $primaryKey = 'TravelbillId';
    protected $fillable = array('ResourceId', 'Destination', 'StartDay', 'StartTime', 'EndDay', 'EndTime', 'Invoice', 'TravelCompensation');
    public $timestamps = true;

    public function travelbill() {
      return $this->belongsTo('User', 'ResourceId', 'ResourceId');
    }

    public function cost() {
      return $this->hasOne('Cost', 'TravelbillId', 'TravelbillId');
    }

    public function allowance() {
      return $this->hasOne('Allowance', 'TravelbillId', 'TravelbillId');
    }
  }

 ?>

Cost.php 模型

<?php

  class Cost extends Eloquent {

    protected $table = 'cost';
    protected $primaryKey = 'CostId';
    // protected $fillable = array('TravelbillId', 'Description', 'DescriptionByHiq', 'SekInklMoms', 'SekExklMoms', 'SekInklMomsByHiq', 'SekExklMomsByHiq', 'Currency', 'ExchangeRate');
    protected $fillable = array('TravelbillId', 'Description', 'DescriptionByHiq', 'SekInklMoms', 'SekMoms', 'SekInklMomsByHiq', 'SekMomsByHiq', 'Currency', 'ExchangeRate');
    public $timestamps = false;

    public function cost() {
      return $this->belongsTo('Travelbill', 'TravelbillId', 'TravelbillId');
    }
  }


 ?>

Allowance.php 模型

<?php

  class Allowance extends Eloquent {

    protected $table = 'allowance';
    protected $primaryKey = 'AllowanceId';
    protected $fillable = array('TravelbillId', 'DayAllowance', 'Breakfast', 'Lunch', 'Dinner');
    public $timestamps = false;

    public function allowance() {
      return $this->belongsTo('Travelbill', 'TravelbillId', 'TravelbillId');
    }
  }


 ?>

或者我在哪里做这个加入,所以如果我得到旅行单,它也会得到请求的成本和津贴数据?

编辑:
我需要将数据输入到我的 AngularJS 表单中,因此如果 id = 1 的人需要编辑他的 Travelbill,他应该能够单击编辑按钮并查看已填写的信息。

标签: phpmysqllaravel

解决方案


您可以在此处执行的最简单的数据检索形式是执行以下操作:

$travelBills = Travelbill::with(['code','allowance'])->get();

这是急切加载,将执行三个查询:

  • 加载所有旅行账单
  • 加载外键与所有旅行单 ID 匹配的所有代码,并将它们分配给每个旅行模型
  • 对津贴做同样的事情

最后,您将拥有每个 Travelbill 模型已经有一个关联的 Code 和 Allowance 模型,让您可以像这样工作:

echo $travelBill->cost->SekInklMoms;

对于您加载的其中一张旅行单。请注意第一个查询中的几件事:

  • 旅行账单没有被过滤,我们现在正在加载它们。
  • 我们做的很简单,不一定有效。我建议先熟悉关系加载,然后再处理诸如连接之类的事情(无论如何这都会破坏 Eloquent ORM 的精神)

推荐阅读