1

Scoreに属するPlayer

class Score extends AppModel {
    public $name = 'Answer';
    public $belongsTo = array('Player');
}

PlayersController、プレーヤーのスコアとその詳細を取得したいと思います。

質問1:メソッドの結果にbelongsToモデルを含める方法はfind?(それに参加)

質問2Score.distance :そのプレーヤーに属するすべてのスコア距離()の合計を取得するにはどうすればよいですか?(つまりSUM(Score.distance)、group by Score.player_id

Q1に関する注意find:各プレーヤーには多くのスコアがあるため、そのコントローラーで使用する各方法でスコアを結合するのは好きではありません。たった1回のアクションで手に入れたい)

4

2 に答える 2

0

だから、PlayerたくさんありScoresます...

class Player extends AppModel {
    public $name = 'Player';
    public $hasMany = array('Score');
}

...つまり、あなたのfind()インPlayersControllerは次のようなものになる可能性があります...

$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',
        ),
    )
);

うまくいけば、あなたはアイデアを得るでしょう。

于 2013-01-23T19:08:09.093 に答える
0

下部のレイアウトのsql_dumpに表示されているように、Cakephpautomagicは実際にはテーブルを結合しません。

以下のクエリが表示されます。

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) 

実際にはテーブルを結合していないことは明らかなので、次の方法で行う必要があります。

そして、私はすでにそれをテストしているので、以下はあなたを助けるでしょう。

Player Controllerでは、最初にスコアモデルのバインドを解除してから、以下のようにスコアテーブルに結合するカスタムコードを作成する必要があります。

プレーヤーモデルで、以下のように1つの仮想フィールドを作成します。

<?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' => ''
        )
    );
}
?>

conditionsテストのために、プレーヤー番号を見つけるために手動で追加しました10 scores

<?php
class PlayersController extends AppController {

    var $name = 'Players';

    function index()
    {

        $this->Player->unbindModel(array
        (
            'hasMany' => array
            (
                'Score'
            )
        ));

        $this->Player->bindModel(array
        (
            'belongsTo' => array
            (
                'Score' => array
                (
                    'foreignKey' => false,
                    'conditions' => array
                    (
                        'Player.id = Score.player_id'
                    )
                )
            )
        ));

        $order = "Player.id";
                $direction = "asc";
                if(isset($this->passedArgs['sort']) && $this->passedArgs['sort']=="Distance")
                {
                        $order = $this->passedArgs['sort'];
                    $direction = $this->passedArgs['direction'];
                    unset($this->passedArgs['sort']);
                    unset($this->passedArgs['direction']);
                }

                $this->pagination = array();

                $this->pagination = array
                (
                    'conditions' => array
                    (
                     'Score.player_id' => 10
                    ),
                    'fields' => array
                    (
                        'Player.*',
                        'SUM(Score.scores) AS Distance'
                    ),
                    'group' => array
                    (
                        'Score.player_id'
                    ),
                    'limit' => 15,
                        'order'=>$order." ".$direction
               );

              $playersScore = $this->paginate('Player');
    }   
}
?>

結果の配列は次のようになります。

Array
(
    [0] => Array
    (
        [Player] => Array
        (
            [id] => 10
            [name] => Dexter Velasquez
            [created] => 2012-08-02 12:03:07
            [Distance] => 18
        )
    )
)

テストには、GenerateMysqlDataを使用しました。

リンクをソートするため

<?php $direction = (isset($this->passedArgs['direction']) && isset($this->passedArgs['sort']) && $this->passedArgs['sort'] == "Distance" && $this->passedArgs['direction'] == "desc")?"asc":"desc";?>

上記のリンクを以下のように表示します。

<?php echo $this->Paginator->sort('Distance','Distance',array('direction'=>$direction));?>
于 2013-01-24T04:42:11.347 に答える