Не спрашивайте, почему, но у меня есть эта ситуация с таблицами.Yii - LIKE на условном соединении
ActiveRecord Транспорт, Компания, TransportDetail и TransportRow связаны с Yii классическим Strutture (BELONG_TO, HAS_MANY и т.д ...)
сожелению, Регионы, Города и провинции не могут быть связаны автоматически to TransportDetails из-за условного соединения на основе значения fromTypeId (есть столбец toTypeId).
Unfortunally Я должен искать TransportRow со свободным текстовым полем, придется искать в LIKE следующих областях: «company.name» (легкий, с Yii отношений) «region.name или city.name или провинции. имя, основанное на значении столбца»
для достижения CompanyName и в целом присоединиться к каждой releation, Im, используя„с“синтаксисом
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
с этим автовхода, поиск по company.name ИЛИ я сливаю базовые критерии с критериями ИЛИ:
$criteriaORCompany = new CDbCriteria();
$criteriaORCompany->compare('company.name',$searchFilter->name,true,'OR');
$criteria->mergeWith($criteriaORCompany);
Эта работа отлично.
Теперь я должен продолжить поиск.
Этот запрос работает нормально, но я не знаю, как его воспроизвести на Yii. Если вы добавите присоединиться к остальным трем таблицам (город, провинция и регион) и в состоянии где силы использовать значение только в том случае 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'))
Я пытался повторить это соединение в Yii добавление вручную объединения, но mergWith произойдет до отношения присоединиться
$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');
Я пытался поставить mergeWith после с, но он не работает:
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
$criteria->mergeWith($criteriaLIKE);
ошибка просто. Когда регионы и область присоединились к другим, SQL не может найти столбец в состоянии ON, потому что принадлежащий ему, но подключенный после них.
Извините за длинный пост.
Любой совет?
Вам нужен совет? Исправьте схему/модель. Тогда вам не придется задавать этот вопрос, потому что у вас не будет проблем. Вероятно, вы чувствуете, что наступает день, когда вам придется это делать, так что сегодня может быть и сегодня. – Bohemian
Я не могу коснуться БД или моделей. – MrMime
Вы можете предложить такую работу своему руководителю, объяснив, что текущая модель DB/модель сломана, а дальнейшее улучшение функции будет очень затруднительным, если это не будет сделано. См. [Технический долг] (https://en.m.wikipedia.org/wiki/Technical_debt) для полного описания вашей ситуации. – Bohemian