gpt4 book ai didi

cakephp - 选择 hasMany 关系的最新记录

转载 作者:行者123 更新时间:2023-12-02 15:56:38 26 4
gpt4 key购买 nike

我的 CakePHP 应用程序中有 2 个基本模型:用户和登录。用户与 Logins 具有 hasMany 关系(即,每次用户登录时都会创建一条新的登录记录)。

现在,我想建立从 User 模型到 Login 模型的 2 个关系:用户有多次登录和用户有一次最后登录

最后一个关系应仅包含所选用户的登录模型的最后一条记录。

我尝试如下:

var $belongsTo = array
(
'LastLogin' => array
(
'className' => 'Login',
'order' => 'LastLogin.created DESC',
'limit' => 1

)
);

但是,这不起作用。关于如何让它发挥作用有什么想法吗?

最佳答案

针对评论的更新答案

对于belongsTo关系,外键应该位于current模型中。

这意味着,如果您希望建立用户属于 LastLogin 的关系,则 users 表应具有 last_login_id 字段。

在您的情况下,您可能想改用 hasOne 关系,并且必须在 fields 键中使用 MAX() SQL 函数。请注意,获取last_login 的工作完全独立于您的User hasMany Login 关系。因此,如果您想要的只是最后一次登录,您可以删除 hasMany 关系,只保留 hasOne。

通过下面的示例代码,您将得到:

/users/index 的输出:

Array
(
[User] => Array
(
[id] => 1
[name] => user1
[last_login] => 2011-05-01 14:00:00
)
[Login] => Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[created] => 2011-05-01 12:00:00
)
[1] => Array
(
[id] => 2
[user_id] => 1
[created] => 2011-05-01 13:00:00
)
[2] => Array
(
[id] => 3
[user_id] => 1
[created] => 2011-05-01 14:00:00
)
)
)

如果您不使用 Model::afterFind() 回调,您的结果将看起来更像这样(登录数组被剪掉以节省空间):

Array
(
[User] => Array
(
[id] => 1
[name] => user1
)

[0] => Array
(
[last_login] => 2011-05-01 14:00:00
)
)

<小时/> 示例代码:

用户表:

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)

登录表:

CREATE TABLE `logins` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)

用户模型:

class User extends AppModel {
var $name = 'User';
var $hasMany = array('Login');
var $hasOne = array(
'LastLogin' => array(
'className' => 'Login',
'fields' => array('MAX(LastLogin.created) as last_login')
)
);

// This takes the last_login field from the [0] keyed array and puts it into
// [User]. You could also put this into your AppModel and it would work for
// all find operations where you use an SQL function in the 'fields' key.
function afterFind($results, $primary=false) {
if (!empty($results)) {
foreach ($results as $i => $result) {
if (!empty($result[0])) { // If the [0] key exists in a result...
foreach ($result[0] as $key => $value) { // ...cycle through all its fields...
$results[$i][$this->alias][$key] = $value; // ...move them to the main result...
}
unset($results[$i][0]); // ...and finally remove the [0] array
}
}
}
return parent::afterFind($results, $primary=false); // Don't forget to call the parent::afterFind()
}
}

用户 Controller :

class UsersController extends AppController {
var $name = 'Users';

function index() {
$this->autoRender = false;
pr($this->User->find('all'));
}
}

关于cakephp - 选择 hasMany 关系的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com