与symfony框架的数据库关系问题 - 无法为未定义的表获取TableMap

时间:2009-05-08 08:33:40

标签: php database frameworks symfony1 foreign-key-relationship

目前正在使用通过PEAR获得的最新版symfony开发应用程序。这是我确切的架构配置

propel:

 user:
  id:
  name:     { type: varchar(255), required: true }
  level:    { type: integer, required: true, default: 1 }
  created_at:    

 post:
  id:
  title:     { type: varchar(255), required: true }
  post:      { type: longvarchar, required: true }
  user_id:   
  created_at:
  updated_at:

 comment:
  id:
  relation:  integer
  comment:   { type: varchar(300), required: true }
  nick:      { type: varchar(100), required: true }
  created_at:
  updated_at:

清醒并意识到你可能已经注意到post中的user_id是用户的外键。根据明确指南; [quote title = Quote:](以_id结尾的列被认为是外键,相关表根据列名的第一部分自动确定)。[/ quote]

每当我尝试构建EITHER过滤器或FORMS(build-filters / build-forms / build-all)时,我都会收到以下错误消息。

>> propel    generating form classes
  -----> Cannot fetch TableMap for undefined table: user.  Make sure you have the static MapBuilder registration code after your peer stub class definition. <------
[?php
/**
 * Post form base class.
 *
 * @package    ##PROJECT_NAME##
 * @subpackage form
 * @author     ##AUTHOR_NAME##
 * @version    SVN: $Id: sfPropelFormGeneratedTemplate.php 16976 2009-04-04 12:47:44Z fabien $
 */
class BasePostForm extends BaseFormPropel
{
  public function setup()
  {
    $this->setWidgets(array(
      'id'         => new sfWidgetFormInputHidden(),
      'title'      => new sfWidgetFormInput(),
      'post'       => new sfWidgetFormTextarea(),
      'user_id'    => new sfWidgetFormPropelChoice(

我也尝试在我的架构中定义foreignTable和foreignReference,但没有运气。这是一个新的symfony项目,仅用于调试此错误。我尝试过为表格使用单数和复数名称。我做错了什么,或者这是一个可靠的错误?感谢任何输入,这让我发疯了!

我在symfony的官方社区有一个论坛帖子,在这里:http://forum.symfony-project.org/index.php/m/77979/ - 有一些建议(比如我忘了使用代字号并且“用户”是预定义的类,但问题到现在为止仍然已解决 [已编辑]。

一个免费的互联网拥抱,主要道具和免费航天飞机,向强大的灵魂提出解决方案!(免责声明:实际上没有免费的航天飞机)

1 个答案:

答案 0 :(得分:2)

更新:问题已经解决了! ......经过无数小时的追溯跟踪和调试。

问题是由在propel.ini中手动编码的TABLE前缀引起的,如下所示:

自定义表格前缀
propel.tablePrefix = mindmonkey _

没有与schema.yml和propel.ini或类似的东西进行通信,所以一切都搞砸了。我的结论是:忘记前缀,只为每个项目使用一个专用的模式...我只是习惯使用前缀,总是这样做 - 但除非特别指示这样做,否则再也不会这样做!