なぜか、私はこのテーブルの状況を尋ねません。Yii - 条件付き参加のLIKE
ActiveRecordの交通、会社、TransportDetailとTransportRowがYiiの古典struttureと関連している(BELONG_TO、HAS_MANY等...)
Unfortunaly、地域、都市と州は、自動的に関連することはできませんtoTypeIdの値に基づいて調整された結合(toTypeId列が存在するため)によって、TransportDetailsに変換されます。
Unfortunally私は、次のフィールドなどに検索する必要がフリーテキストフィールドでTransportRowを検索する必要があります(Yiiの関係で簡単に、) 「company.name」 「region.nameまたはcity.nameまたは県。 「仕入に到達し、一般的に使用するすべてのreleation、イムに参加するには
『マージにcompany.nameで検索する、sintaxこの自動加入して
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
』とOR I列の値に基づいて、名前を付けますOR基準のベース基準:
$criteriaORCompany = new CDbCriteria();
$criteriaORCompany->compare('company.name',$searchFilter->name,true,'OR');
$criteria->mergeWith($criteriaORCompany);
これは完全に機能します。
今、私は検索を拡張する必要があります。
このクエリは正常に機能していますが、私はYiiでそれを再現することはできません。あなたは罰金値を使用するために、他の3つのテーブル(都市、州および地域)に、どこで、条件力に参加typeColumnが正しい値を持っている場合にのみ、検索作業を追加する場合:
[ other join ...]
LEFT OUTER JOIN regions cr on (cr.id = transportDetail.fromId)
LEFT OUTER JOIN provinces cp on (cp.id = transportDetail.fromId)
WHERE ((cr.name LIKE '%TEST%' and toTypeId = 'REGION')
OR (cp.name LIKE '%TEST%' and toTypeId = 'PROVINCE'))
私はしました
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
$criteria->mergeWith($criteriaLIKE);
エラー:これはは、参加が、関係は、私はと後mergeWithを置くことを試みたが、それは動作しません
$criteriaLIKE = new CDbCriteria;
$crt = Region::model()->tableName();
$cpt = Province::model()->tableName();
$criteriaLIKE->join .= 'LEFT OUTER JOIN '.$crt.' cr on (cr.id = transportDetail.fromId)';
$criteriaLIKE->join .= 'LEFT OUTER JOIN '.$cpt.' cp on (cp.id = transportDetail.fromId)';
$criteriaLIKE->addCondition("cr.name LIKE '%probe%' and toTypeId = 'REGION'",'OR');
$criteriaLIKE->addCondition("cp.name LIKE '%probe%' and toTypeId = 'PROVINCE'",'OR');
に参加する前にmergWithが起こる手動で追加のYiiに参加複製しようとしました単純です。リージョンと州が他のフィールドの前に結合されていると、所有されているが列の後に結合された表があるため、SQLは列をON条件で見つけることができません。
長いポストに申し訳ありません。
アドバイスはありますか?
アドバイスが必要ですか?スキーマ/モデルを修正してください。あなたは問題がないので、この質問をする必要はありません。あなたはおそらく今日はそうかもしれないように、あなたはそれをやらなければならない時が来ていると思います。 – Bohemian
DBやモデルに触れられません。 – MrMime
あなたはスーパーバイザーにそのような仕事を提案し、現行のDB /モデルが壊れていることを説明することができます。あなたの状況の完全な説明については、[Technical debt](https://en.m.wikipedia.org/wiki/Technical_debt)を参照してください。 – Bohemian