powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Yii CactiveRecord - не могу добиться нужного запроса.
8 сообщений из 8, страница 1 из 1
Yii CactiveRecord - не могу добиться нужного запроса.
    #39015123
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравсвуйте, ввиду обилия детальной документации у ИИИ возникли трудности

у меня ситуация

есть две таблицы

countrys(id,countryName,is_active)
citys(id,cityName,fk_countryId)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Country extends CactiveRecord{

public function scopes()
{
return array(
  'only_active' => array('alias' => 'cc','condition' => 'cc.is_active = 1'),
);
}

}

class City extends CactiveRecord{}


опустил описание связей...оно автосгенерировано самой ИИИ по наличию
внешнего ключа - каждый город принадлежит оной из стран

и вот я хочу по части имени найти города, но только из активных стран.

интуитивный вариант

Код: php
1.
2.
3.
4.
5.
6.
7.
 //$c - part of cityName
 // relation 'fkCountry' => array(self::BELONGS_TO, 'Country', 'fk_countryId')

$result = City::model()->with('fkCountry:only_active')
->findAll('cityName like :param',array(
	':param' => "%$c%",
));


даёт не тот результат - запрос
Код: sql
1.
2.
3.
select ...
from citys t LEFT OUTER JOIN countrys cc on (cc.id = t.fk_countryId) AND (cc.is_active=1)
where ...


тоесть в результате мы получаем города из неактивных стран - но без страны
например штаты активная страна, канада нет, при названии города otta - получив города
ottawa из штатов и канады, только те что из канады будет без страны.

нужно чтобы условие активности переехало в секцию веар.

другой вариант
Код: php
1.
2.
3.
4.
$result = Country::model()->only_active()->with(array('citys'=> array('alias'=>'tt')))->
findAll('tt.cityName like :param',array(
	':param' => "%$c%",
))



выполняет запрос дающий верный результат но не в том формате
мы получаем масив стран среди активных, которые содержат масив городов совпадающих с нужным шаблонов.

Я могу без проблем кучу вариантов наклепать с мерге критерии и подобное, но хочеться
понять - как же в ИИИ задумывалось подобное применять


ИТАК ВОПРОС

как в ИИИ получить связаный набор данных (исп. with)
при этом применить именнованую группу к одной из связаных моделей??

или по другому, - у нас есть именнованая группа g модели M
и мы можем сделать выборку M::model()->g()->findAll();

как использовать эту именнованую группу в связаной моделии MM по типу

MM::model()->with('M')->g()->findAll() и при этом получалась верная выборка
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39016063
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юи 2 уже вышел так то, зачем первый мучить?
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39016064
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу
MM::model()->with(['m' => ['scopes' => ['g']]])
Если я правильно понял
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39017131
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПо сабжу
MM::model()->with(['m' => ['scopes' => ['g']]])
Если я правильно понял

да это без разницы как задать значение with

что так

"m:g"

что как вы написали.

всеравно ИИИ будет джинить не таблицы m и MM а будет джоин левый к ММ - таблицы полученой после применения условий g к таблице м.

а мне надо, чтобы джоин был таблиц, и потом из джоина отфильтровать записи условиями g

тоесть

ММ(id,fk,value)
1 1 vasya

m(id,active,value)
1 0 pupkin
2 1 nepupkin

g: (active = 1)

в вашем примере результат будет таким

1 1 vasya null null null

ибо джоин будет с таблицей после применения услувия g - тоесть с одной записью
2 1 nepupkin
а так как ссылка только на первую есть, то значит связанных данных нету и будут нулл

мне же надо, чтобы результат был пустым. ибо сначала джоин
1 1 vasya ----- 1 0 pupkin
а потом условие, оно ложно - результат нулевой.
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39017315
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора мне надо, чтобы джоин был таблиц, и потом из джоина отфильтровать записи условиями g

Указать ON можно в реляции или при использовании
Код: php
1.
MM::model()->with(['m' => ['on' => ['m.a' => 't.b']]])
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39017368
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettавтора мне надо, чтобы джоин был таблиц, и потом из джоина отфильтровать записи условиями g

Указать ON можно в реляции или при использовании
Код: php
1.
MM::model()->with(['m' => ['on' => ['m.a' => 't.b']]])



ну, а куда крутить сдесь тогда именованную групу? возможно я туплю, давайте по другому.

таблица
M(id,active,value)

MM(id, fk_mid,val)

мне нужно, чтобы:
1)у модели М была именованая группа, only_active - добавляющая условие active=1

2)получить в результате магической строчки на ИИИ запрос
Код: php
1.
2.
3.
4.
5.
6.
7.
select ...,<all>,<fields>,<of>,<all>,<tables>

from MM as t join| left join #сдесь не важно, ибо нет ММ без М
M as mt on (mt.id = t.fk_mid)

where
mt.active = 1;



то что получалось у меня - выглядело вот так(оба варианта)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select ...,<all>,<fields>,<of>,<all>,<tables>

from MM as t join| left join #сдесь не важно, ибо нет ММ без М
M as mt on (mt.id = t.fk_mid) AND (mt.active=1)

select ...,<all>,<fields>,<of>,<all>,<tables>
from M as mt left join 
MM as t on (mt.id = t.fk_mid)
where
mt.active = 1;
# но второе это впринципе не то что нужно. ибо логика
# найти ММ приклеив к ним М с критериями ММi, но только среди активных М
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39017408
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettавтора мне надо, чтобы джоин был таблиц, и потом из джоина отфильтровать записи условиями g

Указать ON можно в реляции или при использовании
Код: php
1.
MM::model()->with(['m' => ['on' => ['m.a' => 't.b']]])



вообщем ваш коментарий навел меня на мысль, а дайка я гляну исходники, как обрабатыватьеся команда with()
немного смекалки, научного тыка и извечно - да х%%я оно не работает.

получили.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class M extends CactiveRecord{

public function scopes()
{
		$alias = $this->getTableAlias(false,false);
		$scopes = array(
			'only_active' => array(
				'condition' => $alias.'.is_active=1',
			),
		);
		
		return array_merge(parent::scopes(), $scopes);
}

public function relations()
{
return array(
			'MM' => array(self::HAS_MANY, 'MM', 'fk_mId'),
}
}

class MM extends CactiveRecords{
public function relations()
{
return array('fkM' => array(self::BELONGS_TO, 'M', 'fk_mId'),);
}
}



и теперь получаем - список ММ со своими критериями, но вести поиск связав с М и применив критерий только_активные

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$criteriaMM = new CDbCriteria()
// ... fill criteria 

$M_model = M::model();
$M_model->setTableAlias('popa');

$result = MM::model()->with('fkM' => array(
'alias' => $M_model->getTableAlias(false,false),
'condition' => $M_model->getDbCriteria->condition,
))
->findAll($criteriaMM);



даёт нужный запрос мне
...
Рейтинг: 0 / 0
Yii CactiveRecord - не могу добиться нужного запроса.
    #39017409
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может можно проще!?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Yii CactiveRecord - не могу добиться нужного запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]