2012-02-10 112 views
0

我找不到在Propel中使用帶單繼承和抽象父類的findOrCreate()的方法。這個小例子給了我一個致命錯誤Propel無法通過繼承創建具體類的實例?

Fatal error: Cannot instantiate abstract class ComicBook propel\query\ModelCriteria.php on line 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> 

有什麼辦法獲得繼承w與抽象的父類一起工作?

回答

1

單表繼承的主要問題是你總是假貨。因爲真正的模型是AbstractBook,沒有別的你得到這個錯誤...

隨着abstract=false,你就可以實例化一個AbstractBook(該不會是抽象的都...),然後將它轉化到ComicBook

通過設置abstract=true,您不能實例化AbstractBook。壓倒一切的救援!

我沒挖了很多的代碼,但是,如果你想創建ComicBookfindOneOrCreate(),你就必須重寫下列方法:getModelName()ComicBookQuery類:

<?php 

class ComicBookQuery extends BaseComicBookQuery { 

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

} // ComicBookQuery 

這是一個最好的做法,以覆蓋方法,以適應您的需求;)

+0

謝謝,真的讓我的一天哥們。當然,我需要抽象的父類! – gremo 2012-02-10 15:58:20