CakePhp使用另一个表中的valueField创建列表

CakePhp使用另一个表中的valueField创建列表,cakephp,Cakephp,我想从一个表中创建列表,对另一个表使用contain,并从第一个表中生成keyField,但从另一个表中生成VALUEFILD+键 我有表customerNumber(key=>customer\u number)->Users->Groups(value=>name) 需要创建列表,其中所有CustomerNumber.customer_number为键,Groups.name加键为值 这是我的查询(另外,我不想让标准的经典php foreach创建列表) 结果应该是这样的 (int) 110

我想从一个表中创建列表,对另一个表使用contain,并从第一个表中生成keyField,但从另一个表中生成VALUEFILD+键

我有表customerNumber(key=>customer\u number)->Users->Groups(value=>name) 需要创建列表,其中所有CustomerNumber.customer_number为键,Groups.name加键为值

这是我的查询(另外,我不想让标准的经典php foreach创建列表)

结果应该是这样的

(int) 11010080 => Frist group 11010080,
(int) 20000710 => Second group 20000710,
(int) 20001205 => Third group 20001205,
此外,这不是重复的问题@drmonkeynija,因为在您的示例()中,您需要使用单个模型中的虚拟字段选项(例如模型用户,并将名字和姓氏作为一个字段)。在我的例子中,我需要模型客户编号中的虚拟字段和模型组中的另一个字段)

这是纯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;

我的示例是在表ADRESESS中查找名称不同的国家:

$countries = TableRegistry::get('Addresses')->find('list', [
    'keyField' => 'country_id',
    'valueField' => function ($row) {
        return $row->country->name;
    }                
])
->contain(['Countries'])->where(['contact_id IS NOT' => null])
->group(['country_id'])
->order(['Countries.name' => 'asc']);

工作出色

假设您与用户和CustomerNumber表有一对多的关系。在这种情况下,
contain
不会将此作为一个SQL查询运行,因此这将不起作用。@ndm的可能重复项它是不同的。在您的示例中,我可以使用虚拟属性并从单个模型中获取2个或更多列,但在我的示例中,我需要从2个模型中获取虚拟字段。第一个是组(第一个是姓氏),第二个是CustomerNumber模型(列customer_number)。无论您需要从哪个关联中获取某些内容,在回调或结果格式化程序功能(都在读取数据后调用)中,您都可以访问所有包含的关联,你可以建立任何你喜欢的字符串。
$countries = TableRegistry::get('Addresses')->find('list', [
    'keyField' => 'country_id',
    'valueField' => function ($row) {
        return $row->country->name;
    }                
])
->contain(['Countries'])->where(['contact_id IS NOT' => null])
->group(['country_id'])
->order(['Countries.name' => 'asc']);