【发布时间】:2017-09-26 11:36:54
【问题描述】:
我想从一个表创建列表,使用包含另一个表并从第一个表创建 keyField,但从另一个表 + 键创建 valueField。
我有表 CustomerNumbers (key => customer_number) -> Users -> Groups (value => name) 需要创建所有 CustomerNumbers.customer_number 作为键和 Groups.name 加键作为值的列表。
这是我的查询(另外,我不想让标准的经典 php foreach 来创建列表)
$customerNumbers = $customerNumbersTable
->find('list', [
'keyField' => 'customer_number',
'valueField' => 'user.group.name' . ' ' . 'customer_number'
])
->group([
'customer_number'
])
->contain('Users.Groups')
->where(['customer_number >' => 0]);
结果应该是这样的
(int) 11010080 => Frist group 11010080,
(int) 20000710 => Second group 20000710,
(int) 20001205 => Third group 20001205,
这也不是重复的问题@drmonkeyninja,因为在您的示例(Question)中,您需要使用单个模型中的虚拟字段选项(例如,模型用户并将名字和姓氏作为一个字段)。就我而言,我需要模型客户编号中的虚拟字段和模型组中的另一个字段。
这是纯php的解决方案,但我希望也有CakePhp的灵魂。
$getCustomerNumbers = $customerNumbersTable->find('all')
->group([
'customer_number'
])
->contain('Users.Groups')
->hydrate(false);
$customerNumbers = [];
foreach($getCustomerNumbers as $key => $val):
$customerNumbers[$val['customer_number']] =
$val['user']['group']['first_name'] .
$val['user']['group']['last_name'] .
' ('. $val['customer_number'].')';
endforeach;
【问题讨论】:
-
大概您与您的 Users 和 CustomerNumbers 表之间存在一对多的关系。在这种情况下,
contain不会将其作为一个 SQL 查询运行,所以这将不起作用。 -
@ndm 不一样。在您的示例中,我可以使用虚拟属性并从单个模型中获取 2 个或更多列,但在我的情况下,我需要来自 2 个模型的虚拟字段。第一个是 Groups(名字,姓氏),第二个是 CustomerNumber 模型(列 customer_number)作为结果。
-
无论您需要什么关联,在回调或结果格式化程序功能(都在读取数据后调用)中,您都可以访问所有包含的关联,并且您可以构建任何你喜欢的字符串。
标签: cakephp