Не удалось ли Propel создать экземпляр конкретного класса с наследованием? - PullRequest
0 голосов
/ 10 февраля 2012

Я не могу найти способ использовать findOrCreate() с единственным наследованием и абстрактным родительским классом в Propel.Этот небольшой пример дает мне фатальную ошибку :

Фатальная ошибка: невозможно создать экземпляр абстрактного класса ComicBook propel \ query \ ModelCriteria.php в строке 1181

запрос , выдающий эту фатальную ошибку, довольно прост:

$thebook = ComicBookQuery::create()->filterById(1)->findOneOrCreate();

Небольшой фрагмент схемы базы данных :

<table name="book" abstract="true" phpName="AbstractBook">
    <column name="id" type="INTEGER" required="true"
       primaryKey="true" autoIncrement="true"/>
    <column name="type" type="VARCHAR" size="255" required="true"
       inheritance="single">
        <inheritance key="Abstract" class="AbstractBook"/>
        <inheritance key="ComicBook" class="ComicBook" extends="AbstractBook"/>
    </column>
</table>

IsЕсть ли способ получить наследование, работая с абстрактным родительским классом?

1 Ответ

1 голос
/ 10 февраля 2012

Основная проблема с наследованием одной таблицы состоит в том, что вы всегда притворяетесь.Вы получаете эту ошибку, потому что реальная модель - AbstractBook, больше ничего ...

С abstract=false вы сможете создать AbstractBook (который не будет абстрактным вообще ...), а затем он будет преобразован в ComicBook.

. Установив abstract=true, вы не можете создать экземпляр AbstractBook.Переопределение для спасения!

Я не очень много копаю в коде, но если вы хотите создать ComicBook с findOneOrCreate(), вам придется переопределить следующий метод: getModelName() inваш ComicBookQuery класс:

<?php

class ComicBookQuery extends BaseComicBookQuery {

    public function getModelName()
    {
        return 'ComicBook';                                                                                                                              
    }

} // ComicBookQuery

Рекомендуется переопределять методы в соответствии с вашими потребностями;)

...