【问题标题】:how to solve the conflict of "column not found" on symfony 1.4 using doctrine?如何使用学说解决symfony 1.4上“找不到列”的冲突?
【发布时间】:2023-03-27 13:17:02
【问题描述】:

抱歉这个非常具体的问题,我遇到过几次这个问题,而我的解决方案(不是最好的方法是重命名表并做更多的事情),显然它不是一个真正的解决方案,这次我又遇到了同样的情况,有一张我什至没有处理过的表,我想知道以前是否有人遇到过同样的问题。

使用 symfony 1.4 和教义,我从一个不相关的表的查询中得到这个错误

Column not found: 1054 Unknown column 'o.training_id' in 'field list'

我真的不知道出了什么问题,在我的 schema.yml 我有这样的东西

OhrmTraining:
  connection: doctrine
  tableName: training
  columns:
    id_training:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    name:
      type: string(60)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
TrainingDetail:
  connection: doctrine
  tableName: training_detail
  columns:
    id_training_detail:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    training:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
   relations:
    OhrmTraining:
    local: training
    foreign: id_training
    type: one

它与其他表的详细信息有关

喜欢这个

TrainingDetail:
  connection: doctrine
  tableName: training_detail
  columns:
    id_training_deetail:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: true
  training:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
relations:
  Training:
  local: training
  foreign: id_training
  type: one

我认为它是正确的,但在我的学说/base/BaseTraining.class 我最后有这样的东西(用于训练)

public function setUp()
{
    parent::setUp();
    $this->hasMany('TrainingDetail', array(
         'local' => 'id', <--- this should be the id_training_detail??
         'foreign' => 'training_id')); <--- this should be training?

我不知道他们为什么会这样,或者他们是否应该那样......有人可以帮我解决这个问题吗?

我把它们改成了

public function setUp()
{
    parent::setUp();
    $this->hasMany('TrainingDetail', array(
         'local' => 'id_training',
         'foreign' => 'training'));

我还是得到了错误,如果我重新制作模型,所有的都将消失

没有简单的方法可以从数据库创建 schema.yml 文件吗?

编辑: 抛出异常的查询是这样的

 $query = Doctrine_Query::create()
    ->from('Times a')
    ->where('a.employee_id = ?', $employeeId)
    ->orderBy('a.start_date ASC');
    $results = $query->execute();

我检查了员工的基础,它与培训无关,它与培训细节有关......但不是直接与培训,我重新创建了我的模型 10 次,仍然是一样的

【问题讨论】:

  • 我不认为我可以开始理解您的架构,因为您的术语很混乱。也就是说,您在几个地方将training 拼写为trainning。也就是说,在您的关系中,您正在定义 local: training,但该字段名为 trainning。可能还有其他错误。
  • 对不起,真名不是training,是CompanySomethingTrainning,不过我是为了这个案子改的
  • 仔细检查整个模式文件的拼写和缩进。如果缩进错误,Doctrine 可能会混淆。
  • 我检查了它们,它们似乎工作正常,我尝试将它们全部删除,但没有,另一件事是我的 schema.yml 中没有提到表“Times”,我应该声明它吗?

标签: doctrine symfony-1.4


【解决方案1】:

“不过,我得到了错误,如果我重新制作模型,一切都会消失”

这是因为您通过基类编辑了设置,当您构建模型时,基类总是会被覆盖。

“没有简单的方法从数据库创建 schema.yml 文件吗?”

这没有意义。很明显,您可以从架构生成架构文件,否则您将没有架构文件。

根据给定的架构文件,关系的位置看起来是正确的。根据Doctrine's docs

"指定关系时只需要指定外键存在的那一端的关系即可。schema文件解析时反映关系并自动构建对端。如果指定另一端手动生成关系,自动生成无效。”

当您构建模型文件时,doctrine 会正确配置基类中的setUp 方法,因此您无需这样做。如果你想改变关系,通过模式文件改变它,然后重建模型文件。

由于您发布的错误,我怀疑您遇到的问题在于您如何构建查询,无论是通过 DQL 还是模型引用:

“未找到列:1054 '字段列表'中的未知列'o.training_id'”

-- 编辑--

根据错误和您的查询,您可以指定要选择的列,试试这个:

$query = Doctrine_Query::create()
    ->select('a.*')
    ->from('Times a')
    ->where('a.employee_id = ?', $employeeId)
    ->orderBy('a.start_date ASC');

$results = $query->execute();

【讨论】:

  • 感谢您的回答,不幸的是,不,查询是从另一个表中选择 * 的简单查询,甚至不相关,这就是为什么这个错误如此奇怪。我现在不知道该怎么办,我不知道这些数据是从哪里来的!
  • 谢谢,我编辑了我的帖子,你能看一下吗?我在那里发布了我的查询。
  • 非常感谢您的回答,不幸的是,当我尝试您的查询时,我得到另一个错误,调用非对象上的成员函数 evictAll()... 我需要运行一些东西来解决这个问题?或实施什么?感谢您的帮助
  • 我唯一一次看到该错误是我在 DQL 构造中错误命名了别名。在您提供的查询中,情况似乎并非如此,您可以尝试重建模型、表单和过滤器,然后清除缓存并查看是否仍然存在。
  • 正确,但它也用于生成模型文件,更具体地说是基础模型文件。因此,正如您所提到的,如果您在基类中有自定义更改,并重建模型,您的更改将被覆盖。
猜你喜欢
  • 2011-11-26
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多