ФорумПрограммированиеPHP для идиотов → Профи обосрались? UnitOfWork, FK, insertID

Профи обосрались? UnitOfWork, FK, insertID

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 9:32

    Есть объекты Album и Track. Оба они вновь созданные (в базе их еще нет).

    $a = new Album();
    $a->setTitle('Bunkka');

    $t = new Track();
    $t->setTitle('Zoo York');

    $a->addTrack($t);


    Посредством репозитория (EntityManager) они будут помещены в базу

    AlbumCollection::persist($a);
    $em->flush();


    Теперь их (альбом и треки) нужно слинковать, раньше это сделать мы не могли, так как у нас не было их ID'шников в базе.


    Я предлагаю сделать метод onPushToDatabase, в нем ассоциировать присвоенный insertID к записям (альбомам и трекам) и после сохранения всех артистов/треков делать еще один запрос, который как раз и установит соответствия.

    Товарищ заявляет, что в данном случае будет большой оверхед. Какие еще есть варианты?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 августа 2010 г. 9:49, спустя 17 минут 4 секунды

    не ебать мозг и сторить в базу сразу
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 9:58, спустя 9 минут 10 секунд

    это безумие
    Спустя 42 сек.
    Мартин Фаулер негодует, услышав твое предложение
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 11:36, спустя 1 час 37 минут 42 секунды

    Абырвалг я думаю, что UnitOfWork не занимается ссылочной целостностью, этим должны заниматься мапперы, а UnitOfWork их испльзовать…
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 11:42, спустя 6 минут 17 секунд

    ок. Но вопрос в том как это сделать?

    Мапперу нужно сообщить что он сохранен и ему присвоен такой-то ИД…
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 12:04, спустя 21 минуту 50 секунд

    У тебя должен быть регистр мапперов, а там уже внутри решается. Скорее всего ссылочная целостность обеспечиться геренацией ида для родительской по FK записи. Мартин иногда предлагает таблицу типа
    table keys
    varchar primary key
    int nextId

    При создании базы
    insert into keys Values ('Album', 1), ('Track', 1)
    Спустя 248 сек.
    тобишь понял, создаётся объект, с базы резервируется ИД, ну а потом, регистрация в единице работы или как там уже кто как делает
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 августа 2010 г. 12:07, спустя 3 минуты 14 секунд

    теоретики буээ
    Сапожник без сапог
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 12:13, спустя 5 минут 21 секунду

    а ты дуд предпочитаешь нативное программирование? я приучаю себя моделировать, то что буду писать…
    С возвращением, Пiха! hyperoff.ru - качественный хостинг php
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 августа 2010 г. 12:15, спустя 2 минуты 13 секунд


    а ты дуд предпочитаешь нативное программирование? я приучаю себя моделировать, то что буду писать…
    предпочитаю не программировать.
    Сапожник без сапог
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 12:32, спустя 17 минут 25 секунд

    дуд манагер :)
    С возвращением, Пiха! hyperoff.ru - качественный хостинг php
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 августа 2010 г. 13:20, спустя 47 минут 14 секунд

    Нет id к которому надо привязаться? Значит его надо создать в момент попытки чтения

    public function addTrack(MyTrack $t)
    {
     $t->albumId = $this->getId();
    }

    public function getId()
    {
     if ($this->isNew) {
       $this->id = MySmartDbManager::insert('album', array($this));
    $this->isNew = FALSE;
     }
     return $this->id;
    }
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 13:37, спустя 17 минут 20 секунд

    artoodetoo, ну или так, в любом случае если сохранять потом + связь сейчас = нужна генерация точки связи.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 13:52, спустя 14 минут 56 секунд

    artoodetoo, так а откуда MySmartDbManager узнает IDшник? Вставит запись?

    Там еще транзакции, не думаю, что в теле транзакции реально узнать ID вставленной записи
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 14:04, спустя 12 минут 16 секунд

    artoodetoo, так а откуда MySmartDbManager узнает IDшник? Вставит запись?

    Ну у него по ходу вставляет запись, я предлагаю тупо резервировать иды. Просто в мускуле нет родного механизма, а в оракле или скажем в IB/FB это есть

    Там еще транзакции, не думаю, что в теле транзакции реально узнать ID вставленной записи

    да всё реально
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 августа 2010 г. 14:16, спустя 11 минут 52 секунды

    абсолютно реально.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!