Propel ORM:从另一个表中添加一个未与直接外键连接的列

时间:2015-11-13 15:34:49

标签: php sql orm propel

我想将另一个表中的SQL列添加到我的Propel查询中,但我无法使用正常的“ - > withColumn”语句获得此列。第二个表没有通过外键与第一个表连接,但它对于第二个表中的第一个条目中的每个条目都有。两个表之间的连接是来自另外两个表的两个ID 为了更好地理解,这是我的表格:

项:

  • ID
  • 名称
  • expert_id
  • contingent_id

FAVORIT:

  • ID
  • 位置
  • expert_id
  • contingent_id

专家和特遣队:

  • ID
  • ...

我希望条目表中的所有条目都有一个额外的列位置。每个条目都存在一个优先权。使用SQL,此查询没有问题:

SELECT *, (SELECT position FROM favorit AS f WHERE e.expert_id = f.expert_id AND e.contingent_id = f.contingent_id) AS position FROM entry AS e

但我不知道如何使用Propel创建查询。 我试着这样做了:

EntryQuery::create() ->filterByExpertId(1) ->withColumn("select position from favorit AS f where e.expert_id = f.expert_id and e.contingent_id = f.contingent_id", '_favorit_id', 'type: int') ->find();

但是Propel给了我一个错误

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select position from favorit AS f where e.expert_id = f.expert_id and e.continge' at line 1' in D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Adapter\Pdo\PdoStatement.php:57 Stack trace: #0 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Adapter\Pdo\PdoStatement.php(57): PDOStatement->execute(NULL) #1 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Connection\StatementWrapper.php(194): Propel\Runtime\Adapter\Pdo\PdoStatement->execute(NULL) #2 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery\Criteria.php(2633): Propel\Runtime\Connection\StatementWrapper->execute() #3 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery in D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery\Criteria.php on line 2639

当条目表中存在另一个表的外键(例如contingent_id或带有计算列)时,从另一个表添加列没有问题:
EntryQuery::create() ->filterByExpertId(1) ->join('Entry.Contingent') ->withColumn('Contingent.name','_contingentName') ->withColumn("LEFT(TIMEDIFF(TIMEDIFF( {timeEnd {1}} {timeBegin {1}} {暂停{1}}

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法:

$result = EntryQuery::create() ->filterByExpertId($id) ->join('Entry.Contingent') ->join('Contingent.Favorit') ->where('Favorit.expert_id = ?', $id) ->withColumn('Favorit.position','_position') ->find();

有了这个,我得到了正确的答案。但我还有一个问题:

如果条目中存在相应的专家和条件但没有偏好,那么此条目将不会显示我的实际查询。我想在这些情况下作为额外的这个条目,但是具有一些默认值的位置,如null或0(零)。