【问题标题】:Cakephp 3 - Save associated belongsToMany (joinTable)Cakephp 3 - 保存关联的 belongsToMany (joinTable)
【发布时间】:2017-06-08 14:47:27
【问题描述】:

我有一个关于保存一个新实体的问题,该关联是一个 belongsToMany 关系。只是一个简单的介绍。我有一个设置表和一个 setting_values 表。用户通过名为 users_settings 的 joinTable 连接到设置。综上所述:

设置: 编号 |名字

setting_values: 编号 |设置ID |姓名 |价值 |

users_settings: 编号 |用户 ID |设置ID | setting_value_id

现在在添加用户之前,我想用所有设置和每个设置的第一个 setting_value 修补用户的实体。这样 users_settings 现在将所有设置都连接到具有第一个值的用户。但我无法让补丁或 newEntity 正常工作。所有模型都是烘焙的,所以这应该没问题。这是我的代码

$settings = $this->Settings->find('all', [
            'contain' => [
                'SettingValues'
            ]
        ]);

$settingsData = [];

foreach ($settings as $setting) {
    $settingsData[] = [
        'setting_id' => $setting->id,
        'setting_value_id' => $setting->setting_values[0]->id,
    ];
}

$data = [
    'users_settings' => $settingsData
];

$user = $this->Users->patchEntity($user, $data, [
    'associated' => [
        'Settings.UsersSettings'
    ]
]);

这是$user 实体中的结果。如您所见,没有任何内容被正确编组:

users_settings => [
    (int) 0 => [
        setting_id => (int) 1,
        setting_value_id => (int) 1
    ],
    (int) 1 => [
        setting_id => (int) 2,
        setting_value_id => (int) 5
    ]
]

有人可以给我一个建议吗?谢谢

【问题讨论】:

    标签: php cakephp orm associations cakephp-3.0


    【解决方案1】:

    belongsToMany 关联数据的结构不应如此,您必须提供目标,而不是连接表。可以通过特殊的_joinData 键提供额外的连接表数据,即数据应如下所示:

    $data = [
        'settings' => [
            [
                'id' => 1,
                '_joinData' => [
                    'setting_value_id' => 1
                ]
            ],
            [
                'id' => 2,
                '_joinData' => [
                    'setting_value_id' => 5
                ]
            ]
        ]
    ];
    

    这会像这样填充连接表:

    +----+---------+------------+------------------+
    | id | user_id | setting_id | setting_value_id |
    +----+---------+------------+------------------+
    | 1  | 1       | 1          | 1                |
    | 2  | 1       | 2          | 5                |
    +----+---------+------------+------------------+
    

    如果您(需要)使用associated 选项,请确保也指定_joinData 键:

    $user = $this->Users->patchEntity($user, $data, [
        'associated' => [
            'Settings._joinData'
        ]
    ]);
    

    另见

    【讨论】:

    • 这正是我想要的。奇迹般有效。谢谢
    猜你喜欢
    • 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
    相关资源
    最近更新 更多