2013-02-27 48 views
0

我发现很难找到一个好的标题,我希望我能更好地解释它。 我有两个表当候选键不存在时,用外键添加新行

"car" - id, car_id, name 
"car_pictures" - id, fk_car_id, url 

显然,一个“车”能有几张照片是那些通过在“car_pictures”表保存为“fk_car_id”的car_id链接。 工作流程的前端可能是:

- you add a new car to the database 
- you add pictures to this car entry 

如果遵循这样您第一次在“车”表中的新条目。然后,您可以在“car_pictures”表中引用“car_id”。

但是,如果你想改变工作流程是这样的:

- you add a new car 
- you immediately add pictures 
- you save the new car to the database 

如果遵循这样,您就创建数据库条目仅当用户已经完成了所有“台阶”。但是,如果您想将照片添加到汽车中,那么它还没有“car_id”。所以你不能引用id。

如果添加汽车和添加图片是两个独立的api调用,例如通常的做法是什么。

看来我需要澄清我在做什么。 假设我有两个API调用: www.domain.com/api/car/add/?name=newcar - >用于添加汽车(即添加到数据库) www.domain.com/api/car/picture/add /?car_id = x - >用于将图片添加到汽车(即处理上载并将数据存入数据库)

前端看起来像这样: 带有全部表格的页面您可以在其他页面上编辑和添加新照片。另一个页面添加一个新的车也有可能添加图片。这与编辑汽车的页面/形式相同,只是没有car_id可用。

编辑:

我自己能想到的几种方法来处理这种情况。

第一:当用户打开“添加新车”表单时立即为汽车创建数据库条目。这样你总是有一个car_id。但如果用户决定取消添加汽车并需要删除这些“虚拟”数据库条目,则必须处理。如果出现问题,您可能会以数据库中的大量空车入场结束。也许该行有一个标志,当汽车实际上被用户“插入”时该标志被设置。

第二种:插入具有临时否定fk_car_id的新图片,并在数据库中创建行时使用实际的car_id更新这些行。

第三:在没有car_id的情况下,将新照片保存到带有临时ID的临时表中。那么您必须返回该临时ID并在创建数据库中的汽车入口时从临时表中移动这些条目。

但这些想法听起来很复杂,我希望有一些最佳实践方式如何做到这一点。也许问题出在我的工作流程中,并且有更好的方法来做到这一点。然而,分开添加汽车和将图片添加到数据库的过程似乎是一个好主意。

+0

是否有可能为你使用存储过程和/或交易?用这种方法你可以做第一次插入,得到id,然后做第二次插入。如果出现问题,则不会写入数据库。 – GarethL 2013-02-27 17:11:35

+0

为什么你需要car_id在“car”表中? “car”.id链接到fk_car_id – apoq 2013-02-27 17:13:12

+0

我无法使用事务,因为添加图片是一个单独的脚本调用。 – DarsVaeda 2013-02-27 17:14:37

回答

0

一旦你添加了汽车,你想使用mysql_insert_id()来获得在上次查询中生成的ID。然后你可以提交图片。

例如:

mysql_query("INSERT INTO car (name) VALUES ('car')"); 
$last_id = mysql_insert_id(); 
mysql_query("INSERT INTO car_pictures (fk_car_id, link) VALUES (".$last_id.",'link')"); 

我会用PDO代替mysql_不过建议你。

+0

如果在添加汽车和添加图片之间添加新车,则不起作用。否则,你将不得不保存该ID并将其存储在某个地方。这也不反映我喜欢应用的工作流程。 – DarsVaeda 2013-02-27 17:18:05

+0

这应该只用于初始上传。我确信用户可以回去添加更多的图片,在这种情况下他们正在编辑汽车及其图片。 – SeanWM 2013-02-27 17:20:02

+0

是的,但如果添加图片和添加汽车是两个脚本调用,这是我的场景,它不起作用。 – DarsVaeda 2013-03-01 08:01:08

0

您可以car_pictures.fk_car_id空的,那么你可以不插入主记录的图片,并加入车的时候后面更新...

+0

下降的人可以解释为什么吗? FK列可以是空的,并且在那里表示它没有主记录。我不认为这是完美的方法,但它在某些情况下有效。 – a1ex07 2013-02-27 17:19:17

+0

第一:我没有倒下它。 我还有一个问题。如果所有行都为空,你怎么知道哪些图片属于那辆车? – DarsVaeda 2013-03-01 07:59:09

相关问题