Как можно сравнить два объекта ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
mugur
Сообщения: 6
Зарегистрирован: 2017.12.08, 05:30

Как можно сравнить два объекта ActiveRecord

Сообщение mugur »

Добрый день!

Застрял на таком вопросе. Как от двух объектов от ActiveRecord создать новый объект со значениями, которые пересекаются друг у друга? Как найти их пересечение?

//пропущенные звонки
$query = Cdr::find()
->Where(['and',
['like', 'calldate', $day],
['like', 'channel', 'Local/'],
['disposition'=>'NO ANSWER'],
['>=', 'duration', '10'],
['dst'=>[170,160,140,120,110]]
])
->groupBy('src')
->orderBy(['calldate'=>SORT_ASC])
;
//пропущенные звонки

//отвеченные звонки
$query2 = Cdr::find()
->Where(['and',
['like', 'calldate', $day],
['like', 'channel', 'Local/'],
['disposition'=>'ANSWERED'],
['>=', 'duration', '10'],
])
->groupBy('src')
->orderBy(['calldate'=>SORT_ASC])
->asArray()
->all();
;
//отвеченные звонки
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как можно сравнить два объекта ActiveRecord

Сообщение zelenin »

получить список названий атрибутов, перебором все сравнить и создать список пересекающихся, создать новый объект
mugur
Сообщения: 6
Зарегистрирован: 2017.12.08, 05:30

Re: Как можно сравнить два объекта ActiveRecord

Сообщение mugur »

Получается тут сам sql запрос такой

Код: Выделить всё

select src from cdr 
	where 
	calldate LIKE '2017-12-02%' AND 
	channel LIKE'Local/%' AND
	disposition='NO ANSWER' AND 
	duration >=10 AND 
	dst in(170,160,140,120,110) AND 
	src NOT IN (select src from cdr where calldate LIKE '2017-12-02%' AND channel LIKE 'Local/%' AND disposition='ANSWERED' AND duration >=10  GROUP BY src)
GROUP BY src 
И yii2 я сделал как два отдельных запроса. А можно ли это в один запрос сделать?

Код: Выделить всё

	//пропущенные звонки
        $query = Cdr::find()		
		->Where(['and',
                   ['like', 'calldate', $day],
		   ['like', 'channel', 'Local/'],
                   ['disposition'=>'NO ANSWER'],
		   ['>=', 'duration', '10'],
		   ['dst'=>[170,160,140,120,110]]
	       ])
		->groupBy('src')
		->orderBy(['calldate'=>SORT_ASC])
		;
		//пропущенные звонки

		//отвеченные звонки
		$query2 = Cdr::find()
		->select('src')
		->Where(['and',
                   ['like', 'calldate', $day],
		   ['like', 'channel', 'Local/'],
                   ['disposition'=>'ANSWERED'],
		   ['>=', 'duration', '10'],
       	])
	  	->groupBy('src')
	  	->orderBy(['calldate'=>SORT_ASC])
	  	->asArray()
	  	->all();
	  	;
		//отвеченные звонки
steaze
Сообщения: 30
Зарегистрирован: 2017.01.28, 21:25

Re: Как можно сравнить два объекта ActiveRecord

Сообщение steaze »

В условие Where можно добавить подзапрос:

Код: Выделить всё

 ['NOT IN', 'src', $query2]
Но я бы обратил Ваше внимание на сам запрос, у Вас дата в таблице в текстовом формате? Почему делаете такую выборку:

Код: Выделить всё

calldate LIKE '2017-12-02%'
Это не очень хорошо.
Ответить