@FreeAero

Yii2 цикл Join'ов, как?

Здравствуйте, вопрос в заголовке, в Yii я делал цикл из такой строки:

foreach($arr as $key => $value)
{
$criteria->join .= 'LEFT JOIN `table` '. $value .' ON (`'. $value .'`.`value_id`=`t`.`id`)';
}

все работало.

в Yii2 Критерий нет, как быть? в доке не нашел решение

Пробовал так, не сработало:

$query = Product::find();
   foreach(array('1','2','3') as $item)
   {
      $query->JoinWith('filters')->where(['table.value_id'=>$item]);
   }
   
    // В модели Product
    public function getFilters()
    {
        return $this->hasOne(Table::className(), ['products_id' => 'id']);
    }

Проходит только один join, последний
  • Вопрос задан
  • 8175 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
www.yiiframework.com/doc-2.0/guide-query-builder.h...

единственное что - вам придется выдумывать алиасы для таблиц (не уверен разруливается ли это автоматически).
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Как на счёт обычного SQL запроса?
Ответ написан
@LAV45
Если я вас правильно понимаю тогда ваш запрос будет выглядеть как-то так:
$data = Product::find()
	->joinWith('table')
	->where(['table.value_id' => [1, 2, 3]])
	->asArray()
	->all();

Сам не понимаю почему такие sql сгенерировало :(
SELECT `product`.* FROM `product` LEFT JOIN `table` ON `product`.`id` = `table`.`product_id` WHERE `table`.`value_id` IN (1, 2, 3);
SELECT * FROM `table` WHERE `product_id` IN ('1', '2');


Но я бы сделал вот так:
$data = Product::find()
	->with([
		'table' => function(Query $q) {
			$q->where(['value_id' => [1, 2, 3]]);
		}
	])
	->asArray()
	->all();

SELECT * FROM `product`;
SELECT * FROM `table` WHERE (`value_id` IN (1, 2, 3)) AND (`product_id` IN ('1', '2'));

// print_r($data);
Array
(
    [0] => Array
        (
            [id] => 1
            [manufacturer_id] => 2
            [category_id] => 13
            [status] => 10
            [name] => фотокамера Canon SX 150 IS black
            [created_at] => 1395167522
            [updated_at] => 1395167679
            [table] => Array
                (
                    [product_id] => 1
                    [value_id] => 1
                )
        )

    [1] => Array
        (
            [id] => 2
            [manufacturer_id] => 2
            [category_id] => 29
            [status] => 10
            [name] => сумка
            [created_at] => 1395170865
            [updated_at] => 1395170865
            [medium_delivery] => 0
            [table] => Array
                (
                    [product_id] => 2
                    [value_id] => 1
                )
        )
)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы