Reputation: 2706
Code:
mysql_query("
SELECT
message,to_id,from_id,MAX(created) AS created
FROM
".MEMBER_MSG."
WHERE
(to_id='".$uid."' OR from_id='".$uid."')
AND
from_id != '".$uid."'
AND
(to_delete='1' OR from_delete='1')
AND
is_chat='1'
GROUP BY
from_id,to_id
ORDER by
created DESC
");
I want to write above query in CakePHP. How to write in CakePHP?
Edit:
My CakePHP code:
$condition = array(
'OR' => array(
'AND' => array(
'Message.from_id' => $this->Session->read('Auth.User.id'),
'Message.to_id' => $this->Session->read('Auth.User.id')
),
array(
'AND' => array(
'Message.from_id' => $userid['User']['id'],
'Message.to_id' => $this->Session->read('Auth.User.id')
)
)
),
'is_chat' => '1',
array(
'OR' => array(
'AND' => array(
'Message.from_id' => $this->Session->read('Auth.User.id'),
'Message.from_delete' => '1'
),
array(
'AND' => array(
'Message.to_id' => $this->Session->read('Auth.User.id'),
'Message.to_delete' => '1'
)
)
)
)
);
This code is working but not getting the accurate result
MySQL Code:
CREATE TABLE IF NOT EXISTS `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from_id` int(11) NOT NULL,
`to_id` int(11) NOT NULL,
`message` text NOT NULL,
`is_view` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-Not Viewed, 1-Viewed',
`is_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=No, 1=Yes',
`is_chat` tinyint(4) NOT NULL COMMENT '0=No, 1=Yes',
`from_delete` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0-Deleted by From, 1-Not',
`to_delete` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0-Deleted by To, 1-Not',
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`reply_count` smallint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `from_id` (`from_id`),
KEY `to_id` (`to_id`),
KEY `from_delete` (`from_delete`),
KEY `to_delete` (`to_delete`),
KEY `is_view` (`is_view`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Upvotes: 0
Views: 118
Reputation: 1595
Probably the problem is that inside your or
statements you have some values without keys, giving you unproper answer.
Maybe this conditions will help. Note that I did it based on your mysql query rather than your cake $conditions
variable:
$conditions = array(
'OR' => array(
'to_id' => $uid,
'from_id' => $uid
),
'from_id !=' => $uid,
'OR' => array(
'to_delete' => 1,
'from_delete' => 1
),
'is_chat' => 1
);
Still, it's contradictory that you have conditions from_id = 1
and from_id != 1
Upvotes: 2
Reputation: 1263
If you want make it easy:
$this->Message->query("SELECT message,to_id,from_id,MAX(created) AS created FROM ".MEMBER_MSG." WHERE (to_id='".$uid."' OR from_id='".$uid."') AND from_id != '".$uid."' AND (to_delete='1' OR from_delete='1') AND is_chat='1' GROUP BY from_id,to_id ORDER by created DESC;");
But if you want make something more cakeway:
In more complex query sometimes you can't make it easy. Sometimes you only have to use raw query, or rethink your query.
Upvotes: -1