2013-03-09 28 views
0

我對CakePHP很新穎,我想我認爲我已經很快掌握了它的要點。我的問題更多的是與MySQL有關,但最後我會把Cake放回去。CakePHP:Table職位類型的組織

我正在創建一個論壇/公告板類應用程序。目前我在我的數據庫中有一個帖子條目,其中包含常用信息:ID,標題,正文等。

我的問題:我想實現各種不同類型的'posts'。像照片帖子,文本帖子,員工帖子等(類似於tumblr如何組織帖子)。我應該爲每種類型的帖子製作單獨的表格,例如text_posts,photo_posts等?或者我可以在常規郵政表中添加字段,例如「image_url」,如果創建時它留空,那麼我有視圖將其解釋爲文本郵件?

如果我要爲每種不同類型創建單獨的表格,我會在公告板控制器中設置所有這些不同的帖子,以便我可以在公告視圖中顯示它們。但接下來在視圖中,我將如何根據它們的創建時間將它們顯示在一個不錯的Feed中?我不希望有顯示所有文本帖子,所有照片帖子等的循環。我希望它們將它們網格化在一起。

回答

2

在我看來,你在你的數據庫結構中有一個繼承問題。

關係數據庫不支持繼承

三種可能的方法,我知道關閉如何解決這個問題是:

1.Single Table Inheritance(適用於所有職位的一個表中,將有很多空的值然後)

2.Class Table Inheritance(嘗試實現繼承無論如何,但映射您將創建在PHP中的每個對象到表。)

3.Concrete Table Inheritance(每種類型的職位分別表)

哪種解決方案更適合你我不知道。他們各有其優點和缺點。

編輯:PHP的一部分

雖然我不知道很多關於PHP,你也許可以做這樣的事情:

如果選擇選項3,在數據庫中存儲的職位你仍然可以選擇在PHP中引入繼承。通過檢查父類對象(Post)並顯示特定於子對象(照片,文本等)的屬性,方法是檢查它是否是該對象類型的實例。

+0

感謝您的迴應!理想情況下,我認爲單表繼承最容易實現...雖然我更想知道是否更好地利用資源繼續分解它們,而不是使用一堆PHP if語句篩選每次顯示帖子時都會顯示幾個空條目。或者它會不會很重要? – div 2013-03-10 00:49:19

1

從理論上講,您可以爲每個表創建一個不同的表併爲其寫一個視圖。不幸的是,MySQL不支持你需要插入的觸發器。 這是一個使用sqlite3的例子。

create table PhotoTable (
id  integer not null PRIMARY KEY AUTOINCREMENT, 
PhotoName varchar(255), 
Camera varchar(255) 
); 


create table StaffTable (
    id integer not null PRIMARY KEY AUTOINCREMENT, 
    StaffName varchar(255) 
); 

--- Odd way of seeding AUTOINCREMENT value in SQLite3 
insert into StaffTable(StaffName) values('odd'); 
delete from StaffTable; 
update SQLITE_SEQUENCE set seq = 100000 where name ='StaffTable'; 


create view posts as 
select id, 'Photo' as Type, PhotoName, Camera, NULL as StaffName from PhotoTable 
union all 
select id, 'Staff' as Type, NULL as PhotoName, NULL as Camera,StaffName from StaffTable; 



create trigger postsinsert 
instead of insert on posts 
for each row 
begin 
    insert into PhotoTable(PhotoName, Camera) select new.PhotoName, new.Camera where New.Type ='Photo'; 
    insert into StaffTable(StaffName) select new.StaffName where New.Type = 'Staff'; 
end; 


insert into posts(Type, PhotoName, Camera) values('Photo','photo1','nk'); 
insert into posts(Type, PhotoName, Camera) values('Photo','photo2','canon'); 
insert into posts(Type, StaffName) values('Staff', 'spaceghost'); 

,你會得到的

select * from posts; 
1|Photo|photo1|nk| 
2|Photo|photo2|canon| 
100001|Staff|||spaceghost 
+0

嗯這是我不得不考慮的事情。謝謝! – div 2013-03-10 06:29:09

0

預期的結果,我認爲2個表應該比對每種類型創建新表更好。

你可以有posts table和post_types表,在posts表中你可以有post_type_id外鍵,這樣可以幫助你增加類型而不必每次都創建一個新表。

然後在posts表中,儘量使列爲通用列,例如,您可以有一個「值」列,您可以使用它來保存圖片url或其他基於帖子類型的其他內容。

也是值得考慮的,在這個階段,如果你的職位將需要有多種類型,在這種情況下,橋臺是得心應手,上崗另一個用於類型等一個表三分之一堅守崗位和類型ID爲外鍵。