1

そのため、CakePHP 関係を使用して各ユーザーの最後のエントリを取得するクエリを実行しようとしています。私のマップとユーザーモデルには次のものがあります。

class Map (and User) extends AppModel {
    public $hasMany = 'Geolog';
}

そして、このクエリを実行して、各ユーザーの最後のエントリをキャッチしようとしています。dg_maps と dg_users は多対多の関係にあります。

SELECT 
    dg_users.id,
    dg_users.email,
    dg_maps.id,
    dg_maps.latitude,
    dg_maps.longitude,
    dg_maps.timestamp
FROM
    (SELECT 
        *
    FROM
        dg_maps
    ORDER BY dg_maps.timestamp DESC) dg_maps
JOIN
    dg_geologs ON dg_geologs.map_id = dg_maps.id
JOIN
    dg_users ON dg_users.id = dg_geologs.user_id
GROUP BY dg_geologs.user_id;

私が今していることは次のとおりです。

$this->Map->query('SELECT dg_users.id, dg_users.email, dg_maps.id, dg_maps.latitude, dg_maps.longitude, dg_maps.timestamp FROM (SELECT * FROM dg_maps ORDER BY dg_maps.timestamp DESC) dg_maps JOIN dg_geologs ON dg_geologs.map_id = dg_maps.id JOIN dg_users ON dg_users.id = dg_geologs.user_id GROUP BY dg_geologs.user_id');

しかし、Cake メソッドを使用して、これよりも優れた方法であることを私は知っています。それで、どうすればこれを行うことができますか?

皆さん、ありがとうございました!

4

1 に答える 1

1

私はこれを私のプロジェクトに使用しましたが、それは非常に簡単です

ページネーションで使用する CakePHP HABTM 結合を生成する簡単な方法。

したがって、これをモデルに入れます(関数の引数に関する注意 - リンクからの関数にエラーがあります)

public function generateHabtmJoin ($joinModel, $joinType = 'INNER') {
// If the relation does not exist, return an empty array.
if (!isset($this->hasAndBelongsToMany[$joinModel])) {
    return array();
}

// Init joins, and get HABTM relation.
$joins = array();
$assoc = $this->hasAndBelongsToMany[$joinModel];

// Add the join table.
$bind = "{$assoc['with']}.{$assoc['foreignKey']} = {$this->alias}.{$this->primaryKey}";
$joins[] = array(
    'table' => $assoc['joinTable'],
    'alias' => $assoc['with'],
    'type' => $joinType,
    'foreignKey' => false,
    'conditions' => array($bind),
);

// Add the next table.
$bind = "{$joinModel}.{$this->{$joinModel}->primaryKey} = {$assoc['with']}.{$assoc['associationForeignKey']}";
$joins[] = array(
    'table' => $this->{$joinModel}->table,
    'alias' => $joinModel,
    'type' => $joinType,
    'foreignKey' => false,
    'conditions' => array($bind),
);

return $joins;

}

コントローラーからこの関数を呼び出すことができます リンクに例があります

于 2013-09-15T20:19:03.150 に答える