【问题标题】:CakePhp create list with valueField from another tableCakePhp 使用另一个表中的 valueField 创建列表
【发布时间】: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


【解决方案1】:

我在 Adressess 表中查找具有名称的不同国家/地区的示例:

$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']);

好好工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多