CakePHP 在应该插入 HasAndBelongsToMany 模型时正在更新
我有一个小问题。我正在制作一个带有标签和问题的网站。我有一个 Question 模型、Tag 模型、QuestionsTag 模型,一切都很好地组合在一起。用户在提出问题时将标签放入由空格 (foo bar baz) 分隔的字段中,就像在 stackoverflow.com 上一样。
现在,这里是检查标签是否已存在并将标签输入数据库和所需关联的代码:
function create () {
if (!empty($this->data)) {
$this->data['Question']['user_id'] = 1;
$question = $this->Question->save ($this->data);
/**
* Preverimo če se je vprašanje shranilo, če se je,
* vprašanje označimo.
*/
if ($question) {
$tags = explode (' ', $this->data['Question']['tags']);
foreach ($tags as $tag){
if (($tagId = $this->Tag->existsByName($tag)) != false) {
/**
* Značka že obstaja, torej samo povezemo trenuten
* id z vprašanjem
*/
$this->QuestionsTag->save (array(
'question_id' => $this->Question->id,
'tag_id' => $tagId
));
}
else {
/**
* Značka še ne obstaja, jo ustvarimo!
*/
$this->Tag->save (array(
'name' => $tag
));
// Sedaj pa shranimo
$this->QuestionsTag->save(array(
'question_id' => $this->Question->id,
'tag_id' => $this->Tag->id
));
$this->Tag->id = false;
}
; }
}
}
}
问题是这样的,一个问题的 id 为 1,我希望它具有 id 的标签1、2、3。
当调用第二次和第三次保存时,Cake 发现 questions_tags 表中已经有一个 id 为 1 的问题,因此它只更新标签。
但这是不正确的,因为该表中应该有许多具有相同 id 的问题,因为它们引用了属于它们的不同标签。
那么,有没有办法防止这种情况发生呢?阻止保存方法更新?
谢谢你!
I have a small problem. I am making a site that has Tags and Questions. I have a Question model, Tag model, QuestionsTag model, everything fits together nicely. The user upon asking something puts the tags in the field seperated by a space (foo bar baz) much like on stackoverflow.com.
Now, here is the code to check if a tag already exists or not and entering the tag into the database and the required associations:
function create () {
if (!empty($this->data)) {
$this->data['Question']['user_id'] = 1;
$question = $this->Question->save ($this->data);
/**
* Preverimo če se je vprašanje shranilo, če se je,
* vprašanje označimo.
*/
if ($question) {
$tags = explode (' ', $this->data['Question']['tags']);
foreach ($tags as $tag){
if (($tagId = $this->Tag->existsByName($tag)) != false) {
/**
* Značka že obstaja, torej samo povezemo trenuten
* id z vprašanjem
*/
$this->QuestionsTag->save (array(
'question_id' => $this->Question->id,
'tag_id' => $tagId
));
}
else {
/**
* Značka še ne obstaja, jo ustvarimo!
*/
$this->Tag->save (array(
'name' => $tag
));
// Sedaj pa shranimo
$this->QuestionsTag->save(array(
'question_id' => $this->Question->id,
'tag_id' => $this->Tag->id
));
$this->Tag->id = false;
}
; }
}
}
}
The problem is this, a Question has an id of 1 and I want it to have the tags with id of 1, 2, 3.
When the 2nd and 3rd save get called, Cake sees that in the questions_tags table is already a question with id 1, so it just updates the tag.
But this is not correct, as there should be many questions in that table with the same id, as they refer to different tags belonging to them.
So, is there a way to prevent this? Prevent the save method from UPDATEing?
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
此行为并非特定于 HABTM 关系。您正在循环内调用
save()
方法。第一次保存后,会设置一个 id 值,随后的每个保存调用都会看到该 id 并假定它是更新。在循环内,首先需要调用 model->create() 来重置可能存在的 id 值。来自 CakePHP 文档 http://book.cakephp.org/view/75 /保存您的数据:
在你的情况下,它看起来像这样:
This behavior isn't specific to HABTM relationships. You are calling the
save()
method inside of a loop. After the first save, anid
value is set and each subsequent save call sees the id and assumes it's an update. Within a loop, you first need to callmodel->create()
to reset an id value that may exist.From the CakePHP Docs at http://book.cakephp.org/view/75/Saving-Your-Data:
In your case, it would look like this:
查看saveAll。您可以对
$this->Question->saveAll()
进行一次调用,它也会保存您提供的任何关联数据。请注意,对于 HABTM 数据,它将对与该question_id
关联的任何questions_tags
执行DELETE
,然后执行INSERT
> 对于您的数据中包含的所有tag_id
。Check out saveAll. You can make a single call to
$this->Question->saveAll()
, and it will save any associated data you supply as well. Note that with HABTM data, it will perform aDELETE
for anyquestions_tags
associated with thatquestion_id
, then perform anINSERT
for all thetag_id
's included with your data.如果您想确保创建一个新条目(INSERT)而不是更新,您可以在保存调用之前设置
$this->create();
。请参阅http://book.cakephp.org/view/75/Saving-Your -Data(页面上部):循环调用save时,不要忘记调用create()。if you want to make sure, that a new entry (INSERT) is made rather then an update, you can set
$this->create();
right in front of the save call. See http://book.cakephp.org/view/75/Saving-Your-Data (in the upper part of the page): When calling save in a loop, don't forget to call create().