Это моя первая попытка HABTM в CakePHP, и она не идет так, как я надеялся.
У меня есть стол foos
и стол bars
, Когда foo
спасен, я хочу связать несколько bars
с этим. Я пытаюсь сделать это с bars_foos
мост.
Я хочу иметь возможность сохранить таким образом, чтобы я мог передать foo
вместе с кучей bars
что-то вроде:
array(2) {
["Foo"]=> array(1) {
["name"]=> string(7) "someFoo"}
["Bar"]=> array(4) {
[0]=> array(1) {
["ID"]=> int(3)
}
[1]=> array(1) {
["ID"]=> int(9)
}
[2]=> array(1) {
["ID"]=> int(4)
}
[3]=> array(1) {
["ID"]=> int(15)
}
}
}
скажем someFoo
создается с идентификатором 9 … Я хотел бы, чтобы следующие записи были добавлены в bars_foos
Таблица:
+--------+----------+
| bar_ID | foo_ID |
+--------+----------+
| 3 | 9 |
| 9 | 9 |
| 4 | 9 |
| 15 | 9 |
+--------+----------+
В настоящее время ничего не происходит в bars_foos
стол, только foos
таблица обновляется с недавно созданным «someFoo». Единственный раз, когда этот мост должен когда-либо обновляться — это при создании нового Foo
Я пытался следовать документация CakePHP с моей моделью:
class Foo extends AppModel {
public $primaryKey = "ID";
public $hasAndBelongsToMany = array(
'Bar' =>
array(
'className' => 'Bar',
'joinTable' => 'bars_foos',
'foreignKey' => 'foo_ID',
'associationForeignKey' => 'bar_ID'
)
);
}
и используя это в моем контроллере …
$this->Foo->saveAll($data); //$data looks like the Array above in the first code block
Я также попробовал с моим $data
в этих форматах, основанных на вещах, которые я видел при поиске решения:
array(1) {
["Foo"]=> array(3) {
["name"]=> string(7) "FooName"["Bar"]=> array(2) {
[0]=> array(1) {
["ID"]=> int(3)
}
[1]=> array(1) {
["ID"]=> int(2)
}
}
}
}
а также
array(2) {
["Foo"]=> array(1) {
["name"]=> string(7) "fooName"}
["Bar"]=> array(1) {
["Bar"]=> array(2) {
[0]=> array(1) {
["ID"]=> int(3)
}
[1]=> array(1) {
["ID"]=> int(2)
}
}
}
}
и получил тот же результат (новый foo
создается, но ничего не вставляется в bars_foos
Таблица)
Наконец-то все заработало. Кажется, нам не следует явно вставлять ключи идентификаторов для соответствующей таблицы. Этот формат работал для меня:
array(2) {
["Foo"]=>
array(1) {
["name"]=> string(7) "fooName"}
["Bar"]=> array(1) {
["Bar"]=> array(4) {
[0]=> int(3)
[1]=> int(2)
[2]=> int(9)
[3]=> int(7)
}
}
}
и это дает мне желаемый результат в таблице мостов:
+--------+----------+
| bar_ID | foo_ID |
+--------+----------+
| 3 | 9 |
| 2 | 9 |
| 9 | 9 |
| 7 | 9 |
+--------+----------+
Это также, кажется, имеет тот же эффект (не вкладывая идентификаторы бара дважды)
array(2) {
["Foo"]=>
array(1) {
["name"]=> string(7) "fooName"}
["Bar"]=> array(4) {
[0]=> int(3)
[1]=> int(2)
[2]=> int(9)
[3]=> int(7)
}
}
Других решений пока нет …