Laravel Relationship / JOIN无效

时间:2015-05-08 09:47:31

标签: php laravel eloquent laravel-5

我可能会忽略与Eloquent的关系,但是,如果我使用原始SQL,这将是我的查询;

SELECT [I have lots of columns I won't list them all here] 
FROM payments as t1 
LEFT JOIN selected_postcodes_34894839483_1 as t2 ON t1.`Vendor ZIP` = t2.postcode

selected_postcodes_xxxxxxx_x只保存一个邮政编码列表。

我的控制器是这样的;

$temp_table_data = new TempTable;
$payments = $temp_table_data
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")
    ->payment()->get()->toArray();

当时,我认为该查询的 - > payment()部分可能会返回所有相关的付款数据。我不认为这是对的,但我不知道还有什么可以尝试。

我有这样的模特;

class Payment extends Model {
  public function tempTable()
  {
    return $this->belongsTo('App\Models\TempTable', 'postcode', 'Vendor ZIP');
  }

class TempTable extends Model {
  public function setTempTable($selected_tablename){
    $this->table = $selected_tablename;
    return $this;
   }

  public function getTable(){
     if (isset($this->table))
       $this->setTempTable($this->table);
       return $this->table;
    }

  public function payment(){
    return $this->hasMany('App\Models\Payment', 'Vendor ZIP', 'postcode');
  }
}

我试过看看TempTable模型本身是否正常工作 - 忘记了连接/关系;

$data = $temp_table_data->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")->get()->toArray();

确实有效。我得到了一个合适的收藏品。我也尝试取出Vendor ZIP中的空格,但没有任何帮助。

--- --- UPDATE

这是我得到的错误;

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'payments.Vendor ZIP' in 'where clause' 
(SQL: select * from `payments` where `payments`.`Vendor ZIP` is null and `payments`.`Vendor ZIP` is not null)

---第二次更新---

CREATE TABLE `selected_postcodes_1431076067_1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`postcode` varchar(7) DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1581 DEFAULT CHARSET=latin1;

我不是这个表的所有者 - 所以我可能无法更改字段名称以删除空格(除非必要);

CREATE TABLE `payments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Input RAC` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`Input LPC Code` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Input UIN Code` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`Fiscal Year` varchar(5) CHARACTER SET utf8 DEFAULT NULL,
`Contract Number` varchar(14) CHARACTER SET utf8 DEFAULT NULL,
`Foreign Ind` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Valued or Running` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Recoverable Ind` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Contract Title` varchar(93) CHARACTER SET utf8 DEFAULT NULL,
`Contract Start Date` date DEFAULT NULL,
`Current Contract End Date` date DEFAULT NULL,
`IPT or Team Short Title` varchar(8) CHARACTER SET utf8 DEFAULT NULL,
`BLB No DEFFORM 57` varchar(4) CHARACTER SET utf8 DEFAULT NULL,
`Senior Comm Officer Title` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`P2P Contract Exemption` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Current Total Contract Value` int(8) DEFAULT NULL,
`Vendor Code` int(5) DEFAULT NULL,
`Current Vendor Name` varchar(39) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Site Code` int(1) DEFAULT NULL,
`Vendor Reg No` int(7) DEFAULT NULL,
`NCage` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`P2P Ind` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SME Ind` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW1 - Concept` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW2 - Assessment` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW3 - Demonstration` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW4 - Manufacture` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW5 - In-Service` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW6 - Disposal` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW7 - Project Support` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW8 - Ext Assistance` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW9 - Hire/Lease` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW10 - MAC` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW11 - Provision of Services` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW12 - Defence Estates` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`TOW13 - Provision of Utilities` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Ext Assist Cat` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`SIC Code PFI` int(4) DEFAULT NULL,
`SIC` int(5) DEFAULT NULL,
`SIC Version` int(4) DEFAULT NULL,
`SIC Group Cleansed Flag` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SIC Group Uncleansed` int(2) DEFAULT NULL,
`SIC Group Cleansed` int(2) DEFAULT NULL,
`Type01- Int Collab/MOU` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Type02 - Partnering` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Type03 - PFI` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Type04 - Enabling Pan Govt` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Type05 - Framework Tech Services` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Type06 - Enabling MOD Only` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust1 - Navy` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust2 - MOD` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust3 - Army` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust4 - OGD/Agency` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust5 - Air Force` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EndCust6 - Other Govts` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov1 - Int Prop Rights` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov2 - Defcon 176A` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov3 - Interim Payments` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov4 - Liquidated Damages` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov5 - Defform 47SC` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov6 - Defcon 528` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov7 - Earned Value Mgmt` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov8 - Express Guarantee` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov9 - Cttr Log Support` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prov10 - Gain Share` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Competitive Ind` int(1) DEFAULT NULL,
`VOP Indicator` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP1 - DEFCON 127` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP2 - DEFCON 643` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP3 - DEFCON 648` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP4 - DEFCON 653` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP5 - Govt Prof Formula Rates Apply` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NCP6 - Target Cost Arrangement` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEA1 - Being Negotiated` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEA2 - Anticipated But Deferred` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEA3 - Concluded` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEA4 - Not Anticipated` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEA5 - N/A` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CEARef1 - Standard Agreement` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef2 - Omnibus Agreement` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef3 - Master Agreement` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef4 - International MOU` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef5 - Subcontract CEA 1` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef6 - Subcontract CEA 2` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`CEARef7 - Subcontract CEA 3` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item1 - CWI` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item2 - CWA` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item3 - CSI` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item4 - CEI` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item5 - DEFCON 23` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Loan Item6 - DEFCON 694` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SCA1` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SCA2` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SCA3` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SCA Value` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`EC Req Ind` int(1) DEFAULT NULL,
`EC Req 1 - Exempt` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 2 – Non-exempt` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 5 – PSC Non-Schedule 5` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 6 – PSC Schedule 5` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 7 – PWC` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 8 – PSvC` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 9 – Abs of tender` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 10 – R&D (Supply Cont)` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 11 – Extreme urgency` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 12 – Prop/Tech` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 13 – Works/Services` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 14 – Supplies/Wks/Svcs added` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req 15 – Cat B Service` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Req Advert` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`EC Requirements Below Threshold` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Sustainable Procurement Pre` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Sustainable Procurement Post` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CITS Applicable` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CITS Type Sub CTR` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Contract Transparency Indicator` int(1) DEFAULT NULL,
`FOI Absolute Exemption` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`FOI Exemption` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Military Sensitive Technical Information` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Warlike Stores` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`CIO Endorsed Exemption` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Financial Transparency Indicator` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Warlike Stores (Total Exemption)` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`FT CIO Endorsed Exemption` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`NAMCO funded Contract` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`PO Header Closed Code` varchar(4) CHARACTER SET utf8 DEFAULT NULL,
`PO Header Closed Date` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Hist EndCust7` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EndCust8` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist NCP6` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist Prov6` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist TOW13` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist TOW14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist TOW Other` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist Type04` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`IMP EU` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`IMP Non EU` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Security Classification` int(1) DEFAULT NULL,
`Overseas Subcontractor` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
`Price Status 1 - Agreed at Outset` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Price Status 2 - tba` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Price Status 3 - Firm` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Price Status 4 - Fixed` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Price Status 5 - Provisional` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 3` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 4` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 7` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 9` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 11` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Hist EC Req 18` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`Prime LOW Code` int(4) DEFAULT NULL,
`Prime LOW Percentage` int(1) DEFAULT NULL,
`Prime Region` varchar(13) CHARACTER SET utf8 DEFAULT NULL,
`Prime UK-Overseas` varchar(13) CHARACTER SET utf8 DEFAULT NULL,
`Prime LOW Payment` decimal(9,2) DEFAULT NULL,
`Prime LOW VAT` int(1) DEFAULT NULL,
`TLB Code` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`TLB Name` varchar(27) CHARACTER SET utf8 DEFAULT NULL,
`IMG Code` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`MG Code` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`BLB Code` int(4) DEFAULT NULL,
`BLB Name` varchar(24) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Address Line1` varchar(23) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Address Line2` varchar(32) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Address Line3` varchar(28) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Address Line4` varchar(22) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Address Lines Alt` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Vendor City` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Vendor County` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Vendor ZIP` varchar(7) CHARACTER SET utf8 DEFAULT NULL,
`Vendor Country` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5001 DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:2)

我看到的一个问题是,使用您给定的代码,您在空payment()个对象上调用了TempTable。要获取相关记录,首先需要获取TempTable条记录。为了打破它,你已经完成了:

$temp_table_data = new TempTable;

// start with empty TempTable object
$payments = $temp_table_data

    // set the table attribute on the empty object
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")

    // gets the payment relationship from the empty object
    ->payment()

    // gets all the payments for an empty object
    ->get()

    // converts collection to array
    ->toArray();

要获取TempTable对象的相关付款,首先需要获取已填充的TempTable对象。例如:

$temp_table = new TempTable;
$temp_table_data = $temp_table
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")
    ->get();

// $temp_table_data is now a Collection of all the records in the given table

// loop through all the records and print out their payments
foreach($temp_table_data as $tt) {
    print_r($tt->payment->toArray());
}

另请注意,如果您希望加快速度,可以从临时表中获取记录时eager load付款关系:

$temp_table_data = $temp_table
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")
    ->with('payment') // eager load payment relationship
    ->get();

修改

对有关预先加载的评论的回复

在这种情况下,由于您必须在创建模型的新实例后设置表名,因此无法在模型上调用with();您需要向下钻取并在使用实例化模型创建的查询对象上调用with()。因此,您需要再添加一个对方法链的调用,而不是上面的代码:

$temp_table_data = $temp_table
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")
    ->newQuery() // get a new query builder object for this instance
    ->with('payment') // eager load payment relationship on the query object
    ->get();

当您在模型上调用with()时,它会创建模型的新实例,然后使用该新实例创建新的查询构建器对象。您遇到的问题是模型的新实例不会设置表名。

编辑2

对有关选择特定列的评论的回复

如果您想修改付款上使用的查询(例如只选择特定列),您有两种选择,具体取决于您是否急于加载。

如果不是急切加载,您只需像其他任何查询一样修改付款查询:

foreach($temp_table_data as $tt) {
    // note the use of the relationship query (payment()), not the Collection attribute (payment)
    print_r($tt->payment()->select('Input RAC', 'Contract Number', 'Foreign Ind')->toArray());
}

如果急切加载,您可以修改用于急切加载数据的查询。在with()方法中,您将一组关系传递给eager load,其中键是关系的名称,值是用于修改关系查询的Closure。这里需要注意的一点是,如果修改了select子句,则必须将包含外键的列包含在TempTable表中,否则Laravel将不知道如何链接正在创建的对象。

$temp_table_data = $temp_table
    ->setTempTable("selected_postcodes_{$timestamp_string}_{$userid}")
    ->newQuery() // get a new query builder object for this instance
    ->with(['payment' => function ($query) {
        // this Closure contains the query object for the payment relationship
        // make sure your select includes the foreign key
        $query->select('Vendor ZIP', 'Input RAC', 'Contract Number', 'Foreign Ind');
    }]) // eager load payment relationship on the query object
    ->get();