2017-02-14 11 views
1

私はこのクエリで作業しています。LinuxのjoinWith(YII2)でエイリアスを追加できません

$data = RtvReqDet::find() 
      ->joinWith(['header', 'rtvCard.serial sn', 'rtvCard.serial.item si', 'rtvCard.item ri' ]) 
      ->select([ 
       'header.requested_by as classification', 
       'ifnull(sn.no, rtvCard.serial_no) AS serial', 
       'ifnull(si.no, ri.no) AS item', 
       'ifnull(si.uom, ri.uom) AS uom', 
       'COUNT(ifnull(sn.no, rtvCard.serial_no)) AS qty', 
      ]) 
      ->where(['rtv_spare_parts_requisition_id' => $record->id ]) 
      ->groupBy(['serial'])->all(); 

これはWindowsで動作しています。しかし、Linux上で動作していないし、このエラーを与える:

Exception 'yii\base\InvalidParamException' with message 'app\models\RtvCard has no relation named "serial AS sn".' 

Linuxで正確に私のPHPバージョンとmysqlバージョンを下げようとしました。私はまだ窓で取引することができます。だから、それはPHPとmysqlのバージョンとの矛盾はありません。これで間違っていると思いますか?

これはrtvCardモデルです。これは私が以前に働いていた同僚によってカスタマイズされました。私はこの議論で必要ではないと思うところでいくつかの関係を削除しました。

If you need an alias for an intermediate table when joining over nested relations, e.g. $query->joinWith(['orders.product']) , you need to nest the joinWith calls like in the following example:

$query->joinWith(['orders o' => function($q) { 
    $q->joinWith('product p'); 
}]) 
->where('o.amount > 100'); 

<?php 

namespace app\models; 

use app\components\ActiveRecord; 
use app\components\FieldException; 
use yii\base\Exception; 

class RtvCard extends ActiveRecord { 

    static function tableName() { 
     return "rtv_card"; 
    } 

    static function objectName() { 
     return "rtv card"; 
    } 

    // RELATIONS 
    function getCustomer() { 
     return $this->hasOne(Customer::className(), [ "id" => "customer_id" ])->from([ "customer" => Customer::tableName() ]); 
    } 
    function getSerial() { 
     return $this->hasOne(SerialNumbers::className(), [ "id" => "serial_id" ])->from([ "serial" => SerialNumbers::tableName() ]); 
    } 
    function getItem() { 
     return $this->hasOne(Items::className(), [ "id" => "item_id" ])->from([ "item" => Items::tableName() ]); 
    } 
    function getTransfer() { 
     return $this->hasOne(RtvTransferDetail::className(), [ "rtv_card_id" => "id" ])->from([ "transfer" => RtvTransferDetail::tableName() ]); 
    } 

    // USED FOR ERROR MESSAGES 
    static $attributeLabels = [ 
     "id" => "ID", 
     "no" => "RTV No", 
     "item_id" => "Item", 
     "serial_id" => "Serial no.", 
     "defect_id" => "Defect", 
     "description" => "Complaints", 
     "date_received" => "Date received", 
     "received_by" => "Received by", 
     "customer_id" => "Dealer", 
     "reference_no" => "Reference no.", 
     "tag" => "Tag", 
     "technician_id" => "Technician", 
     "warehouse" => "Warehouse", 
    ]; 
    // FIELD NAMES IN VIEW IF NOT THE SAME WITH ATTRIBUTE 
    // USE STATIC::GET-FIELD($ATTRIBUTE-NAME) 
    // ATTRIBUTE NAME SHOULD BE THE TABLE ATTRIBUTES ITSELF (NOT THE FIELD NAME IN VIEWS) 
    // ATTRIBUTE NAME => FIELD NAME 
    static $attributeFields = [ 
     "item_id" => "item", 
     "serial_id" => "serial", 
     "defect_id" => "defect", 
     "customer_id" => "dealer", 
     "received_by" => "received-by", 
     "date_received" => "received-date", 
     "reference_no" => "reference-no", 
     "open_serial_id_no" => "no", 
     "open_serial_id_item" => "item", 
     "technician_id" => "technician", 
    ]; 
+0

あなたの質問にrtvCardモデルを追加してください。他のOSで? – scaisEdge

+0

これはYii 2バージョンですか? – Bizley

+0

@scaisEdgeはい! Linux OSでは動作しませんがWindowsでは動作します。 uhm、これはRtvCardModelのようなものですが、私は2つのシナリオを持っています。 1.)ユーザがシリアルtbl検索を選択すると、デフォルトの項目tblに関連します。 2.ユーザがシリアルを入力することを選択した場合、 tbl。だからこそ私は – BlackSkull

答えて

1

のYii 2.0.7以来、リレーショナルエイリアスのショートカットが'rtvCard.serial sn' なく 'rtvCard.serial AS sn' docsから

ASはあまりにも動作しますBizleyさんのコメントより)でありますだからあなたの場合:

RtvReqDet::find() 
    ->joinWith(['rtvCard' => function($q) { 
     $q->joinWith(['serial sn', 'serial.item si', 'item ri']); 
    }]) 
    ->select([ ... 
+0

ところで、私はすでにこれをしました。それも私が試した最初のものでした。そして、それは "Windows"上でスムーズに動いています。私はこれを言い忘れました。ごめんなさい。 – BlackSkull

+0

YiiとMySQLのどのバージョンをお使いですか? – topher

+1

これは当てはまりません。これは 'AS 'でも使えます。 – Bizley

1

ウィンドウのファイル名は小文字を区別しないが、Linuxの場合ですので、.. ..あなたのバージョンは、両方のインストールに同じです...しかし、あなたのファイルSI正しく大文字ていることを確認してくださいfoを確認することを

RtvCard.php 

優れているの大文字と小文字が区別されます。 コントローラーでも、クラス名を使用すると.....大文字と小文字を区別する適切な名前を参照してください。

+0

ohh。私はラクダのケースを使いました。私はここで大文字のRtvCardを忘れてしまった。 haha – BlackSkull

+0

Linux OSでYiiのコピーを更新しようとします。私は、OSの2つのバージョンが不一致であった唯一の問題は、ベンダのフォルダをアップロードしていないと思うからです。それとも私は思った?私たちがシステムを終了したら、私はすべてのファイルをアップロードします。ありがとう! – BlackSkull

関連する問題