Cakephp 在find方法中加入belongsTo

Cakephp 在find方法中加入belongsTo,cakephp,join,model,model-associations,Cakephp,Join,Model,Model Associations,分数属于玩家: 在PlayerController中,我想获得球员的分数,以及他的详细信息 问题1:如何在find方法结果中包含belongsTo模型?加入 问题2:如何获得所有分数的总和?属于该玩家的距离是多少?我是说SUMScore.distance,按分数分组。玩家id Q1注意:因为每个玩家都有很多分数,我不喜欢在控制器中使用的每个查找方法中加入分数。我只想在一个动作中得到他们所以,玩家有很多分数 。。。这意味着您在PlayerController中的发现可能类似于 $players =

分数属于玩家:

在PlayerController中,我想获得球员的分数,以及他的详细信息

问题1:如何在find方法结果中包含belongsTo模型?加入

问题2:如何获得所有分数的总和?属于该玩家的距离是多少?我是说SUMScore.distance,按分数分组。玩家id

Q1注意:因为每个玩家都有很多分数,我不喜欢在控制器中使用的每个查找方法中加入分数。我只想在一个动作中得到他们

所以,玩家有很多分数

。。。这意味着您在PlayerController中的发现可能类似于

$players = $this->Player->find(
    'all',
    array(
        'contain' => array('Score'), // <-- If you're not using Containable Behavior, remove.
        'conditions' => array('Player.id' => $id), // <-- Change or remove as necessary.
        'fields' => array(
            'Player.id',
            'Player.name',
            'Sum(Score.distance) as sum_dist',
        ),
        'group' => array(
            'Player.id',
            'Player.name',
        ),
        'order' => array(
            'Player.name',
        ),
    )
);

希望您能明白这一点。

Cakephp automagic并没有像您在底部布局中的sql_dump中看到的那样实际连接表

您将看到下面的查询

SELECT `Player`.`id`, `Player`.`name`, `Player`.`created` FROM `players` AS `Player` WHERE `Player`.`id` = 10 GROUP BY `Player`.`id`

SELECT `Score`.`id`, `Score`.`player_id`, `Score`.`scores` FROM `scores` AS `Score` WHERE `Score`.`player_id` = (10) 
很明显,它实际上并没有连接表,所以您需要按照下面的方法来做

下面的内容将对您有所帮助,因为我已经对它进行了测试

在玩家控制器中,您需要首先解除绑定分数模型,然后自定义代码以加入分数表,如下所示

<?php
class Player extends AppModel
{
    var $name = 'Player';
    var $displayField = 'name';

    var $virtualFields = array
    (
        'Distance' => 'SUM(Score.scores)'
    );

    var $hasMany = array
    (
        'Score' => array
        (
            'className' => 'Score',
            'foreignKey' => 'player_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
?>
<?php echo $this->Paginator->sort('Distance','Distance',array('direction'=>$direction));?>
在播放器模型中创建一个虚拟场,如下所示

<?php
class Player extends AppModel
{
    var $name = 'Player';
    var $displayField = 'name';

    var $virtualFields = array
    (
        'Distance' => 'SUM(Score.scores)'
    );

    var $hasMany = array
    (
        'Score' => array
        (
            'className' => 'Score',
            'foreignKey' => 'player_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
?>
<?php echo $this->Paginator->sort('Distance','Distance',array('direction'=>$direction));?>
生成的数组如下所示

Array
(
    [0] => Array
    (
        [Player] => Array
        (
            [id] => 10
            [name] => Dexter Velasquez
            [created] => 2012-08-02 12:03:07
            [Distance] => 18
        )
    )
)
为了测试我用过

用于排序链接

<?php $direction = (isset($this->passedArgs['direction']) && isset($this->passedArgs['sort']) && $this->passedArgs['sort'] == "Distance" && $this->passedArgs['direction'] == "desc")?"asc":"desc";?>
并显示上面的链接,如下所示

<?php
class Player extends AppModel
{
    var $name = 'Player';
    var $displayField = 'name';

    var $virtualFields = array
    (
        'Distance' => 'SUM(Score.scores)'
    );

    var $hasMany = array
    (
        'Score' => array
        (
            'className' => 'Score',
            'foreignKey' => 'player_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
?>
<?php echo $this->Paginator->sort('Distance','Distance',array('direction'=>$direction));?>

cakephp实际上查找相关的表并将数据附加到数组中。所以,您需要手动强制cakephp解除旧关系的绑定并与bindModel连接。。。因为只要表未连接,您就不能在查询中使用其他表字段…希望您理解我的意思。谢谢。它很好用。但是如何使用分页组件来实现呢?并按距离排序。或其他列您不必担心分页,因为每个分页的页面都将执行此代码,因此您的数据将是准确的,因为分页的页面按表列排序。但在这里,我们没有一个真正的列,而是使用一个虚拟列。如何按距离对所有玩家进行排序?并对页面进行分页。但是当我们设置limit=>15时,它只返回1个玩家,我在表分数中有很多玩家,玩家和那个玩家有一个距离,它是分数表中所有距离的总和,而不仅仅是玩家分数距离。谢谢,但它不起作用:SQLSTATE[42S22]:未找到列:1054“字段列表”中的未知列“Score.distance”@kikio您正在使用可包含行为,对吗?还是删除了“contain”参数并正确设置了“recursive”?