Arrays Cakephp模型自连接和如何检索正确的数组
我有以下型号:Arrays Cakephp模型自连接和如何检索正确的数组,arrays,cakephp,hash,model,self-join,Arrays,Cakephp,Hash,Model,Self Join,我有以下型号: App::uses('AppModel', 'Model'); class Sync extends AppModel { public $belongsTo = array( 'Unit' => array( 'className' => 'Sync', 'foreignKey' => 'parent_id' ) ); public $hasMany =
App::uses('AppModel', 'Model');
class Sync extends AppModel {
public $belongsTo = array(
'Unit' => array(
'className' => 'Sync',
'foreignKey' => 'parent_id'
)
);
public $hasMany = array(
'Consultant' => array(
'className' => 'Sync',
'foreignKey' => 'parent_id'
)
);
}
如果我执行一个$this->Sync->find('all')
我会得到一个数组,几乎是我想要的方式:
Array
(
[0] => Array
(
[Sync] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Unit] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
问题是我想对顾问做一个条件。像这样:
$this->Sync->Consultant->find('all', array(
'conditions' => array(
'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
'2011-12-01 00:00:00', '2011-12-31 00:00:00'
)'
)
))
但是,它没有返回所需的阵列:
Array
(
[0] => Array
(
[Unit] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-11-15 00:00:00
)
)
[1] => Array
(
[Unit] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-12-14 00:00:00
)
[Consultant] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
我想把它写在这张表格上:
Array
(
[0] => Array
(
[Unit] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
你是如何做到的?我能想到的可能解决方案是使用contain或Hash::class,但不知道如何使用
我们将非常感谢您在这件事上的任何帮助。必须在同步模型上进行查找,以获得所需的效果,我将首先尝试包含。按照本页上的说明为Containeable设置模型 然后你会有这样的东西
$this->Sync->find('all',
array(
'contain'=>
array('Consultant'=>
array(
'conditions' =>
array(
'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
'2011-12-01 00:00:00', '2011-12-31 00:00:00'
)'
)
)
)
)
);
必须在同步模型上进行查找以获得所需的效果,我会首先尝试包含。按照本页上的说明为Containeable设置模型 然后你会有这样的东西
$this->Sync->find('all',
array(
'contain'=>
array('Consultant'=>
array(
'conditions' =>
array(
'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
'2011-12-01 00:00:00', '2011-12-31 00:00:00'
)'
)
)
)
)
);
好的,我减少了同步中的行数,这就是它给我的:
array(
(int) 0 => array(
'Sync' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array(
(int) 0 => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
(int) 1 => array(
'id' => '22222',
'parent_id' => '11111',
'statistic_date' => '2011-12-14 00:00:00'
),
(int) 2 => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
)
)
),
(int) 1 => array(
'Sync' => array(
'id' => '22222',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2011-12-14 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
),
(int) 2 => array(
'Sync' => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
)
Array
(
[0] => Array
(
[Sync] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
)
这更接近于我想要实现的目标,但并不确切。我不想显示同步模型,我只想显示数组[0],其余的都不想显示
使用Hash::extract($data'{n}.Consultant')可以得到:
)
此外,如果id=parent\u id所在的行不存在,则该行上的Hash::filter()将给出令人满意的结果
Hash::filter()提供:
)好的,我减少了同步中的行数,这就是它给我的:
array(
(int) 0 => array(
'Sync' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array(
(int) 0 => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
(int) 1 => array(
'id' => '22222',
'parent_id' => '11111',
'statistic_date' => '2011-12-14 00:00:00'
),
(int) 2 => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
)
)
),
(int) 1 => array(
'Sync' => array(
'id' => '22222',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2011-12-14 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
),
(int) 2 => array(
'Sync' => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
)
Array
(
[0] => Array
(
[Sync] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
)
这更接近于我想要实现的目标,但并不确切。我不想显示同步模型,我只想显示数组[0],其余的都不想显示
使用Hash::extract($data'{n}.Consultant')可以得到:
)
此外,如果id=parent\u id所在的行不存在,则该行上的Hash::filter()将给出令人满意的结果
Hash::filter()提供:
)好的,我解决了这个问题。这就是我所做的。我动态绑定模型:
App::uses('AppModel', 'Model');
class Sync extends AppModel {
function unit() {
$this->bindModel(array(
'hasMany' => array(
'Consultant' => array(
'className' => 'Sync',
'conditions' => array(
'Consultant.statistic_date BETWEEN ? AND ?' => array('2011-12-01 00:00:00', '2011-12-31 00:00:00')
),
'foreignKey' => 'parent_id'
)
)
));
return $this->find('all', array(
'conditions' => array(
'Sync.id = Sync.parent_id'
)
));
}
}
这给了我:
array(
(int) 0 => array(
'Sync' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array(
(int) 0 => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
(int) 1 => array(
'id' => '22222',
'parent_id' => '11111',
'statistic_date' => '2011-12-14 00:00:00'
),
(int) 2 => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
)
)
),
(int) 1 => array(
'Sync' => array(
'id' => '22222',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2011-12-14 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
),
(int) 2 => array(
'Sync' => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
)
Array
(
[0] => Array
(
[Sync] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
好的,我解决了这个问题。这就是我所做的。我动态绑定模型:
App::uses('AppModel', 'Model');
class Sync extends AppModel {
function unit() {
$this->bindModel(array(
'hasMany' => array(
'Consultant' => array(
'className' => 'Sync',
'conditions' => array(
'Consultant.statistic_date BETWEEN ? AND ?' => array('2011-12-01 00:00:00', '2011-12-31 00:00:00')
),
'foreignKey' => 'parent_id'
)
)
));
return $this->find('all', array(
'conditions' => array(
'Sync.id = Sync.parent_id'
)
));
}
}
这给了我:
array(
(int) 0 => array(
'Sync' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array(
(int) 0 => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
(int) 1 => array(
'id' => '22222',
'parent_id' => '11111',
'statistic_date' => '2011-12-14 00:00:00'
),
(int) 2 => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
)
)
),
(int) 1 => array(
'Sync' => array(
'id' => '22222',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2011-12-14 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
),
(int) 2 => array(
'Sync' => array(
'id' => '33333',
'parent_id' => '11111',
'statistic_date' => '2011-12-15 00:00:00'
),
'Unit' => array(
'id' => '11111',
'parent_id' => '11111',
'language_code' => null,
'statistic_date' => '2012-12-11 00:00:00'
),
'Consultant' => array()
)
Array
(
[0] => Array
(
[Sync] => Array
(
[id] => 22222
[parent_id] => 22222
[statistic_date] => 2012-11-14 00:00:00
)
[Consultant] => Array
(
[0] => Array
(
[id] => 11111
[parent_id] => 22222
[statistic_date] => 2011-12-15 00:00:00
)
[1] => Array
(
[id] => 33333
[parent_id] => 22222
[statistic_date] => 2011-12-14 00:00:00
)
)
)
)
当尝试此功能时,应用程序将永远工作。我是说,几分钟,却没有收到任何东西。我在syncs表中有大约22000行,但我认为这不是问题所在。有没有其他方法可以解决这个问题?您是否尝试过将recursive设置为-1。另一个选择是在尝试此操作时执行手动连接,因为应用程序将永远工作。我是说,几分钟,却没有收到任何东西。我在syncs表中有大约22000行,但我认为这不是问题所在。有没有其他方法可以解决这个问题?您是否尝试过将recursive设置为-1。另一个选项是手动连接。我们是否可以通过更改模型而不是使用自定义循环来组合[Sync]和[Consultant]阵列以获得一个组合阵列?我们是否可以通过更改模型而不是使用自定义循环来组合[Sync]和[Consultant]阵列以获得一个组合阵列