私はこのクエリで作業しています。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 thejoinWith
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",
];
あなたの質問にrtvCardモデルを追加してください。他のOSで? – scaisEdge
これはYii 2バージョンですか? – Bizley
@scaisEdgeはい! Linux OSでは動作しませんがWindowsでは動作します。 uhm、これはRtvCardModelのようなものですが、私は2つのシナリオを持っています。 1.)ユーザがシリアルtbl検索を選択すると、デフォルトの項目tblに関連します。 2.ユーザがシリアルを入力することを選択した場合、 tbl。だからこそ私は – BlackSkull