Yii CDBCriteria Komplexe Join-Abfrage
Ich habe 3 Tabellen:
- bank
- bank_details
- bank_bank_details
Verhältnis zwischen Ihnen:
bank Modell:
public function relations() {
return array(
'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_id'),
);
}
bank_details Modell:
public function relations() {
return array(
'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_details_id'),
);
}
bank_bank_details Modell:
public function relations()
{
return array(
'bank' => array(self::BELONGS_TO, 'Bank', 'bank_id'),
'bankDetails' => array(self::BELONGS_TO, 'BankDetails', 'bank_details_id'),
);
}
Will ich Holen Bankverbindung wie bank_name, ifsc etc-info im admin-view von bank_details Modell.
Den normalen SQL-Abfrage habe ich erstellt, funktioniert einwandfrei:
SELECT b.name
FROM bank b
LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id
LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id
WHERE bd.bank_details_id = bbd.bank_details_id
LIMIT 0 , 30
Nun ich will einfach nur integrieren, diese mit Yii CDBCriteria, sondern seine nicht funktioniert für mich. Bitte überprüfen Sie den code unten:
public function search() {
$criteria = new CDbCriteria;
// select b.name
// from bank b
// left join bank_bank_details bbd
// on bbd.bank_id = b.bank_id
// left join bank_details bd on bd.bank_details_id = bbd.bank_details_id
// WHERE bd.bank_details_id = bbd . bank_details_id;
$criteria->compare('bank_details_id', $this->bank_details_id);
$criteria->compare('first_holder_name', $this->first_holder_name, true);
$criteria->compare('nominee1', $this->nominee1, true);
$criteria->select = 'b.name';
$criteria->join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id ';
$criteria->join .= 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id';
$criteria->condition = 'bd.bank_details_id = bbd.bank_details_id';
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'pagination' => array(
'pageSize' => 10,
),
));
}
Fehler:
500-Fehler Gefunden
CDbCommand konnte nicht die SQL-Anweisung ausführen: SQLSTATE[42S22]: Column nicht found: 1054 Unknown column 'b.bank_id' in 'on clause'
Jede mögliche Hilfe würde geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie den alias, um Ihre Tabelle so Aussehen:
$criteria->alias='b';
oder verwenden Sie die Standard-alias "t" statt "b"Lesen Sie mehr auf
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail
CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.bank_id' in 'on clause'
$criteria = new CDbCriteria; $criteria->select = 'b.name'; $criteria->alias = 'b'; $criteria->join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id '; $criteria->join .= 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id'; $criteria->condition = 'bd.bank_details_id = bbd.bank_details_id'; ...
und es funktioniert. Sie haben sql-Abfrage, die Ursachen Ihrer Fehler in logs?Versuchen:
Haupt-Tabelle (in AUS) hat alias
t
und nachcompare
Sie bereits mit einigen Zustand, als Sie brauchen, um zu ergänzen, nicht umschreibenUPDATE
Wenn Sie die Abfrage von Modell
bank_details
dann die Haupt-Tabelle (inFROM
) mussbank_details
. Abfrage:$criteria->select = 'b.name'; $criteria->alias = 'bank t'; $criteria->join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = t.bank_id '; $criteria->join .= 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id'; $criteria->addCondition('bd.bank_details_id = bbd.bank_details_id');
Recht?b
(spielt keine Rolle). Denken Sie nur daran: Haupt-Tabelle in ActiveRecord queries immer aliast
, aber Sie können es ändern, wenn Sie wollenCDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.bank_id' in 'on clause'
t.
bin ich update meine LösungCDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list'
t.
zuname
imselect
(siehe Antwort)CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.name' in 'field list'
. Ich bin nicht immer, wo ich bin, die falsch gehen. Gibt es irgendein Problem in der Beziehung? Weil die sql-Abfrage funktioniert einwandfrei.bank_details
als inFROM
werden müssen Tabellebank_details
. Versuchen Sie, neue LösungActive record "BankDetails" is trying to select an invalid column "bank.name". Note, the column must exist in the table or be an expression with alias.
BankDetails
hat nicht die Eigenschaft, die für das laden dieser Wert. Versuchen Sie es ändern, wählen Sie aufb.name as bank_name
und Eigenschaft hinzufügenpublic $bank_name
ModellBankDetails
. Aber ich weiß nicht, wie alle es ist. Vielleicht denkst du besser über die Beziehung: Sie können sich den Namen der bank, indem Sie die folgenden code:$bname = $bank_detail_item->bankBankDetails[0]->bank->name
?!$criteria->select = 'bank.name as bank_name'; $criteria->with = array( 'bankBankDetails' => array('joinType' => 'LEFT JOIN'), 'bankBankDetails.bank' => array('joinType' => 'LEFT JOIN'), ); $criteria->addCondition('t.bank_details_id = bankBankDetails.bank_details_id');
Recht?BankDetails
public $bank_name;
aber immer noch zeigt seineCDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'bank.name' in 'field list'
search
. Sie können es tun, indem Sie diesen codeexit( $this->getCommandBuilder()->createFindCommand($this->getTableSchema(), $this->getDbCriteria())->text );
vorreturn
. Es muss zeigen Sie die sql-Abfrage...SELECT * FROM
bank_details` `t`exit( $this->getCommandBuilder()->createFindCommand($this->getTableSchema(), $criteria)->text );
SELECT bank.name as bank_name FROM
bank_details`t
WO t.bank_details_id = bankBankDetails.bank_details_id;`$criteria->join = 'LEFT JOIN bank_bank_details bbd ON bd.bank_details_id = bbd.bank_details_id'; $criteria->join .= 'LEFT JOIN bank ON bbd.bank_id = bank.bank_id';
statt$criteria->with(...)
. Und entfernen$criteria->addCondition(...)
- es mit in der join-BedingungCDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'bank'
$criteria->with = array( 'bankBankDetails' => array('joinType'=>'LEFT JOIN'),'bankBankDetails.bank' => array('joinType'=>'LEFT JOIN'), 'bankBankDetails.bank.newTable' => array('joinType'=>'LEFT JOIN'), );
hier
$criteria->select = 'b.name';
Sie wählen nur den Namen der bank und keine id ausgewählt ist
Nicht sicher mit dem yii-format so etwas wie
$criteria->select = 'b.name,b.bank_id';
oder
$criteria->select = array('b.name,b.bank_id');
Als @Evgeniy erwähnt, müssen Sie den alias mit
$criteria->alias = 'b';
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail
Möglicherweise möchten Sie auch zu schauen, mit
CDbCriteria::with
Sie können diese verwenden, um wählen Sie passende Modelle.http://www.yiiframework.com/doc/api/1.1/CDbCriteria#with-detail
Wenn Sie die oben genannten, stellen Sie sicher, dass Sie auch
CDbCriteria::together
richtig. Wählen Sie alle zugehörigen Modelle auf einmal, legen Sie es auftrue
;http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail