Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.22, 23:22
Здравтсвуйте. есть таблица с товаров. В этой таблице есть столбец 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
Сообщение
caHek2x » 2017.05.23, 00:32
почитайте что такое связи (hasOne/hasMany) и соответственно жадная загрузка (with)
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 09:40
В моделе Sertificate я сделал:
Код: Выделить всё
//связь с пользователями
public function getPartners(){
return $this->hasMany(Product::ClassName(), ['number' => 'number']);
}
а как в контроллере вызывать?
$list = Sertificate::find()->with('number')->all();
так не работает.
Alexum
Сообщения: 683 Зарегистрирован: 2016.09.26, 10:00
Сообщение
Alexum » 2017.05.23, 09:57
Название связи формируется из имени метода геттера.
Код: Выделить всё
$list = Sertificate::find()->with('partners')->all();
rodion_zlobin
Сообщения: 207 Зарегистрирован: 2017.01.11, 16:33
Сообщение
rodion_zlobin » 2017.05.23, 10:01
Код: Выделить всё
//в моделе
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
Сообщение
Artikk » 2017.05.23, 10:25
$list = Sertificate::find()->with('partners')->all(); так работает
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 11:19
вопрос, а как сделать теперь условие where? мне нужно, чтобы была выборка, где поле product_partner_ids из таблицы PRODUCT => $id ?
PartyPoison
Сообщения: 69 Зарегистрирован: 2017.04.27, 11:04
Сообщение
PartyPoison » 2017.05.23, 11:51
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
Сообщение
Artikk » 2017.05.23, 12:08
Делал так, так оно ищет в таблице Sertificate, а мне надо product
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 12:18
сделал так: $list = Product::find()->with('partners')->where(['product_partner_ids' => $id])->all();
вопрос, а как мне взять данные из ТАБЛИЦЫ sertificat?
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 13:15
сделал в виде в цикле:
<?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
Сообщение
Alexum » 2017.05.23, 13:32
Смотрите не запутайтесь в названиях связей.
Код: Выделить всё
foreach($item->partners as $sertificate){
echo $sertificate->status;
}
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 16:16
Код: Выделить всё
<?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. как мне быть?
Alexum
Сообщения: 683 Зарегистрирован: 2016.09.26, 10:00
Сообщение
Alexum » 2017.05.23, 16:29
Artikk писал(а): ↑ 2017.05.23, 16:16
foreach в foreach?
А кто-то запрещает?
Отчего GridView не используете?
Artikk
Сообщения: 742 Зарегистрирован: 2017.02.10, 09:12
Сообщение
Artikk » 2017.05.23, 17:12
сделал так:
Код: Выделить всё
<?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
Сообщение
Artikk » 2017.05.23, 17:14
думаю из-за того, что number повторяется
caHek2x
Сообщения: 1242 Зарегистрирован: 2016.04.12, 20:41
Сообщение
caHek2x » 2017.05.23, 17:21
что не так и чего вы хотите добиться ?