Запрос бд

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Запрос бд

Сообщение Artikk »

Здравтсвуйте. есть таблица с товаров. В этой таблице есть столбец product_partner_ids - id партнера.
Вот я выбираю из нее товары определенного партнера:

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

$list = Product::find()->where(['product_partner_ids' => $id])->all();
Теперь, есть таблица сертификатов. в ТАБЛИЦЕ ПРОДУКТОВ И СЕРТИФИКАТОВ есть два одинаковых поля NUMBER.
Как мне вывести из таблицы сертификатов по полю NUMBER. Т.е. сравнить с полем NUMBER в продуктах.
как это сделать?)))

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

$list = Product::find()->where(['product_partner_ids' => $id])->all();

foreach($list as $it){


	$q = Sertificate::find()->where(['number' => $it->number])->all();
}
так не получилось)))
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Запрос бд

Сообщение caHek2x »

почитайте что такое связи (hasOne/hasMany) и соответственно жадная загрузка (with)
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

В моделе Sertificate я сделал:

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

//связь с пользователями
	public function  getPartners(){
		return $this->hasMany(Product::ClassName(), ['number' => 'number']);
	}
а как в контроллере вызывать?
$list = Sertificate::find()->with('number')->all();
так не работает.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Запрос бд

Сообщение Alexum »

Название связи формируется из имени метода геттера.

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

$list = Sertificate::find()->with('partners')->all();
Аватара пользователя
rodion_zlobin
Сообщения: 207
Зарегистрирован: 2017.01.11, 16:33

Re: Запрос бд

Сообщение rodion_zlobin »

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


//в моделе
public function  getSertificates(){
	return $this->hasMany(Sertificate::ClassName(), ['number' => 'number']);
}

//вывод
$products = Product::find()->all();

foreach ($products as $product) {
	// получаем модели сертификатов
	$sertificates= $product->sertificates;
}

Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

$list = Sertificate::find()->with('partners')->all(); так работает
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

вопрос, а как сделать теперь условие where? мне нужно, чтобы была выборка, где поле product_partner_ids из таблицы PRODUCT => $id ?
Аватара пользователя
PartyPoison
Сообщения: 69
Зарегистрирован: 2017.04.27, 11:04

Re: Запрос бд

Сообщение PartyPoison »

Artikk писал(а): 2017.05.23, 11:19 вопрос, а как сделать теперь условие where? мне нужно, чтобы была выборка, где поле product_partner_ids из таблицы PRODUCT => $id ?
Наверное where использовать.

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

ertificate::find()->with('partners')->where(['id' => $id])->asArray()->all();
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

Делал так, так оно ищет в таблице Sertificate, а мне надо product
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

сделал так: $list = Product::find()->with('partners')->where(['product_partner_ids' => $id])->all();
вопрос, а как мне взять данные из ТАБЛИЦЫ sertificat?
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

сделал в виде в цикле:
<?php echo print_r($item->partners)?>

но мне выводится:

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

Array ( [0] => app\models\Sertificate Object ( [_attributes:yii\db\BaseActiveRecord:private] => Array ( [id] => 3 [user_id] => 4 [number] => 12345 [kod] => 3422 [status] => 0 [partner_id] => 0 [created_at] => 2017-05-23 11:16:58 [name] => [sroc] => [dates] => [price] => [product_partner_ids] => 0 ) [_oldAttributes:yii\db\BaseActiveRecord:private] => Array ( [id] => 3 [user_id] => 4 [number] => 12345 [kod] => 3422 [status] => 0 [partner_id] => 0 [created_at] => 2017-05-23 11:16:58 [name] => [sroc] => [dates] => [price] => [product_partner_ids] => 0 ) [_related:yii\db\BaseActiveRecord:private] => Array ( ) [_errors:yii\base\Model:private] => [_validators:yii\base\Model:private] => [_scenario:yii\base\Model:private] => default [_events:yii\base\Component:private] => Array ( [beforeInsert] => Array ( [0] => Array ( [0] => Array ( [0] => yii\behaviors\TimestampBehavior Object ( [createdAtAttribute] => created_at [updatedAtAttribute] => updated_at [value] => yii\db\Expression Object ( [expression] => NOW() [params] => Array ( ) ) [attributes] => Array ( [beforeInsert] => Array ( [0] => created_at ) ) [skipUpdateOnClean] => 1 [owner] => app\models\Sertificate Object *RECURSION* ) [1] => evaluateAttributes ) [1] => ) ) ) [_behaviors:yii\base\Component:private] => Array ( [0] => yii\behaviors\TimestampBehavior Object ( [createdAtAttribute] => created_at [updatedAtAttribute] => updated_at [value] => yii\db\Expression Object ( [expression] => NOW() [params] => Array ( ) ) [attributes] => Array ( [beforeInsert] => Array ( [0] => created_at ) ) [skipUpdateOnClean] => 1 [owner] => app\models\Sertificate Object *RECURSION* ) ) ) )
как мне STATUS достать?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Запрос бд

Сообщение Alexum »

Смотрите не запутайтесь в названиях связей.

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

foreach($item->partners as $sertificate){
   echo $sertificate->status;
}
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

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

<?php foreach($list as $item):?>
						<tr>
							<td class="hidden-xs">
								<p class="crt_nme"><?php echo $item->name?></p>
							</td>
							<td class="hidden-xs">
								<p class="crt_nme"><?php echo $item->partners['status']?></p>
								<?php echo print_r($item->partners[1])?>
							</td>
							<td class="hidden-xs">
								<p class="crt_nme"><?php echo $item->price?></p>
							</td>
							<td class="hidden-xs">
								<p class="crt_nme"><?php echo $item->created_at?></p>
							</td>
							<td class="hidden-xs">
								<p class="crt_nme"><?php echo $item->number?></p>
							</td>
							<td class="hidden-xs">
									<p class="crt_nme"><?php echo $item->kod?></p>
							</td>
						</tr>
					<?php endforeach;?>
у меня уже есть foreach. как мне быть?
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

foreach в foreach?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Запрос бд

Сообщение Alexum »

Artikk писал(а): 2017.05.23, 16:16 foreach в foreach?
А кто-то запрещает?

Отчего GridView не используете?
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

сделал так:

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

<?php foreach($list as $item):?>
		<tr>
			<td class="hidden-xs">
				<p class="crt_nme"><?php echo $item->name?></p>
			</td>
			<td class="hidden-xs">
				<p class="crt_nme">
					<?php foreach($item->partners as $sertificate):?>
						<?php echo $sertificate->status;?>
					<?php endforeach;?>
				</p>
			</td>
			<td class="hidden-xs">
				<p class="crt_nme"><?php echo $item->price?></p>
							</td>
			<td class="hidden-xs">
				<p class="crt_nme"><?php echo $item->created_at?></p>
			</td>
			<td class="hidden-xs">
				<p class="crt_nme"><?php echo $item->number?></p>
			</td>
			<td class="hidden-xs">
				<p class="crt_nme"><?php echo $item->kod?></p>
			</td>
		</tr>
	<?php endforeach;?>
вот что выводит:
http://c2n.me/3KFXenS

а вот как в бд http://c2n.me/3KFXrew
а чем ошибка?
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Запрос бд

Сообщение Artikk »

думаю из-за того, что number повторяется
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Запрос бд

Сообщение caHek2x »

что не так и чего вы хотите добиться ?
Аватара пользователя
rodion_zlobin
Сообщения: 207
Зарегистрирован: 2017.01.11, 16:33

Re: Запрос бд

Сообщение rodion_zlobin »

Ну так у вас номеру два сертификата относятся. Мутная схема какая то)
Ответить