CakePHP 2 Models hasMany as hasOne

时间:2015-12-19 20:21:45

标签: cakephp cakephp-2.x

我试图将此作为MVC / CakePHP 2尽可能做到这一点,如果我的方法不正确,我很想知道(仍在学习)。我觉得我正在做的事情应该发生在模型中而在控制器中则不那么发生(跟随胖模型瘦的控制器主体)。

我在两个表之间有一个hasMany关系:

trainings hasMany days.

如果我想要训练中的所有日子,此设置将按预期工作。

但我希望(在每次训练中)训练的第一天。我的思考过程是在Training模型中设置一个hasOne关系,如下所示:

public $hasOne = array(
    ...
    'FirstDay' => array(
      'className' => 'Day',
      'foreignKey' => 'training_id',
      'fields' => 'FirstDay.training_date',
      'order' => array('FirstDay.training_date ASC'),
    )
);

本质上,培训有一天为FirstDay

我认为通过此设置,如果我调用Training对象,我将获得关联的FirstDay

相反,我获得了Training的多个条目 - 针对给定培训的每个实例天数。获得输出的SQL如下:

SELECT `Training`.`id`, `Training`.`course_id`, `Course`.`name`, ...  `FirstDay`.`training_date`
  FROM `tst`.`trainings` AS `Training`
  LEFT JOIN `tst`.`courses` AS `Course` ON (`Training`.`course_id` = `Course`.`id`)
  ...
  shortened for your benefit
  ...
  LEFT JOIN `tst`.`days` AS `FirstDay` ON (`FirstDay`.`training_id` = `Training`.`id`)
  WHERE 1 = 1 ORDER BY `FirstDay`.`training_date` ASC LIMIT 20

我假设hasOne会在上面的条款中设置限制1而不是20。既然没有,我尝试添加一个'limit' => 1但是没有用,文档也没有提到它作为hasOne关系中的一个选项。我也不明白为什么WHERE 1 = 1在那里,但我觉得它没关系,因为它是一个不限制任何东西的真实陈述 - 似乎是不必要的提升。

1 个答案:

答案 0 :(得分:0)

关系类型hasOne是使用LEFT JOIN实现的,因此无法支持LIMIT作为选项,因为它会影响整个查询(不仅限制{{ {1}}但Day也是如此。

您的问题有几种解决方法。最简单的方法是将关联定义为Training,但设置hasMany

'limit'=>1

或者,您可以在public $hasMany = array( 'FirstDay' => array( 'className' => 'Day', 'foreignKey' => 'training_id', 'fields' => 'FirstDay.training_date', 'order' => array('FirstDay.training_date ASC'), 'limit' => 1 ) ); 后使用[0]删除额外的数字索引Hash::map()

find()

有关其他可能的选项,请参阅: