【发布时间】:2011-01-14 06:13:15
【问题描述】:
在面向对象的 PHP 中处理多对多关系的最佳方式是什么?
如果我有三个表、书籍和类别以及连接表 bookscategories(处理多对多),我应该创建一个名为 bookcategories 的模型/类并在那里处理与书籍-类别关系有关的所有事情吗?
我对以下伪代码的具体问题是:
- 我是否将方法正确分配给了适当的类?
- 有没有更好的方法来实现这一点,而且不是很复杂?
- 在哪个类中处理链接关系?例如$book->link_to_cat('5')?
- 使用此方法的任何注意事项(如果适用)。
非常感谢任何建议!提前致谢!
伪代码:
<?php
class Books {
//handles all book table stuff
public function delete_book() {
//deletes specific book
//deletes all related bookcategories using find_by_book_id
}
}
class Categories {
// handles all category stuff
}
class BookCategories {
public static function get_cats_by_book_id {
// sql join statement to retrieve category objects by book id
}
public static function get_books_by_cat_id {
}
public static function find_by_book_id() {
//returns bookcategories by book id.
}
}
?>
【问题讨论】:
-
就我个人而言,我会放弃
BookCategories类——这是一个不必要的实现细节。只需在 book 类中添加get_categories()方法,在 category 类中添加get_books()方法即可。或者,在每个构造函数中添加代码,以便在创建类别/书籍对象时拉出所有链接的书籍/类别。 -
为什么你的类名是复数?
-
@Sam - 即使 BookCategories 有其他属性,例如 BookCategory assign_date、assign_by_user 等,您是否会建议这样做?
-
@Marc - 是伪代码中的错误。感谢您的敏锐!
-
@Nick - 是的。就一本书而言,每个类别只有 1 个 assign_date、assign_by_user 等与之关联。当我想到对象时,一本书和一个类别很简单。 BookCategory 到底是什么?是否有过您会关心 BookCategory 的情况,除了与 BookCategory 或 Category 相关的情况?