active record many to many как сделать запись?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

active record many to many как сделать запись?

Сообщение knowill »

делаю я такой код и по какойто причене последняя строка выполняется наоборот.
The SQL being executed was: INSERT INTO `market_user` (`user_id`, `market_id`) VALUES (10, 9) т.е должно быть 9 и 10 наоборот 10 и 9

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

        $user = new User();
        $user->firstname = 'Foo21';
        $user->lastname = 'oof21';
        $user->email = 'a21@f.o';
        $user->save();

        $market = new Market();
        $market->name_of_group = 'Bar21';
        $market->save();

        $market->link('user', $user);
 
вчем причина?
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: active record many to many как сделать запись?

Сообщение Restlin »

А можете показать как вас связь объявлена в модели Market? Мне кажется вы там перепутали поля местами.
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

Re: active record many to many как сделать запись?

Сообщение knowill »

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

public function getGroups()
    {
        return $this->hasMany(Groups::className(), ['id' => 'employee_id'])
                ->viaTable('groups_of_employee', ['group_id' => 'id']);
    } 

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

    public function getEmployee()
    {
        return $this->hasMany(Employee::className(), ['id' => 'group_id'])
                ->viaTable('groups_of_employee', ['employee_id' => 'id']);
    } 
employee вместо user
group вместо маркет
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: active record many to many как сделать запись?

Сообщение Restlin »

Вообще вроде бы все по правилам
Использование link
и промежуточные таблицы
промежуточные таблицы

Единственно, что я делаю через метод via, а не viaTable.
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: active record many to many как сделать запись?

Сообщение Restlin »

knowill писал(а):походу баг
Не уверен, давно бы на него уже наступили. Думаю кто-нибудь да заметит косяк.
А вы пробовали этими отношениями на чтение пользоваться? Они верные данные возвращают?
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

Re: active record many to many как сделать запись?

Сообщение knowill »

Restlin писал(а):
Не уверен, давно бы на него уже наступили. Думаю кто-нибудь да заметит косяк.
А вы пробовали этими отношениями на чтение пользоваться? Они верные данные возвращают?
переделал через via всер норм работает. нет, нужны данные из двух таблиц через связь многие ко многим, и в поле имя группы( 'groups.name_of_group') пусто.

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

<div class="site-index">
<?= GridView::widget([
    'dataProvider' => $provider,
    'columns' => [
        'lastname',
        'email',
        'groups.name_of_group'
    ],
]);  
?>    
может я гдето ошибся?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: active record many to many как сделать запись?

Сообщение Nerf »

public function getGroups()
{
return $this->hasMany(Groups::className(), ['id' => 'employee_id'])
->viaTable('groups_of_employee', ['group_id' => 'id']);
}
Все перепутано.
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

Re: active record many to many как сделать запись?

Сообщение knowill »

как получать данные с этих таблиц если свзять многий ко многим? например мне нужно получить столблцы с employee и имя группы через промежуточную таблицу?

mysql> show columns from employee;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| firstname | varchar(30) | NO | | NULL | |
| lastname | varchar(30) | YES | | NULL | |
| position | tinyint(1) | NO | | 0 | |
| email | varchar(50) | NO | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> show columns from groups;
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name_of_group | varchar(50) | NO | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> show columns from groups_of_employee;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| employee_id | int(10) unsigned | NO | MUL | NULL | |
| group_id | int(10) unsigned | NO | MUL | NULL | |
+-------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: active record many to many как сделать запись?

Сообщение ElisDN »

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

foreach ($employee->groups as $group) {
    echo $group->name;
} 
Ответить