我正在开发一个php web应用程序,用户可以在其中创建到目的地的旅行,并邀请其他用户参加这些旅行。
我有用于Destinations
、Trips
和Users
的mysql表,还有一个名为Invites
的表来解决Users
和Trips
之间的多对多关系。
对于每个表,我都在应用程序中创建了一个类(因此Destinations
是一个类,Trips
是一个类,等等)。我已经为这些类中的每一个编写了一个静态函数,它允许从mysql查询中实例化对象及其属性(因此从SELECT *
查询返回的每一行都会导致实例化对象并分配属性)。
我试图创建一个页面,我的用户可以在其中查看他们计划的所有旅行的详细信息。此页将显示目的地(fromDestinations
)、行程详细信息(例如date fromTrips
)和他们邀请的用户的详细信息(例如username fromUsers
),并将所有这些数据放在html表中,其中每个行程都是一行。
为了实现这一点,到目前为止,我已经实例化了与用户的Trips
、user_id
和Destinations
相关的Invites
,以及与那些Trips
相关的Users
。然后,我使用嵌套foreach循环根据需要显示这些内容,例如:
foreach($trips as $trip) {
foreach($invites as $invite) {
foreach($invited_users as $invited_user) {
if($invite->trip_id == $trip->id && $invite->guest_id == $invited_user->id) {
echo $invited_user->name;
} } } }
我看这很可怕,没办法。
通过阅读,我想我想使用mysql来连接4个表,然后只选择与我的相关行程相关的数据。但我不确定的是:
a)如何从这个mysql结果中实例化对象并正确分配它们的属性?
b)即使这样,我如何避免昂贵的
Invites
循环在正确的行程旁边显示正确的数据?是否有一种“最佳实践”方法可以以面向对象的方式显示来自多个相关数据库表的数据?
最佳答案
我认为你把事情搞复杂了,你不需要一次加载所有的数据。
为什么要遍历所有trips,而需要显示一个用户的trips?
面向对象的一种简单而天真的方法:一个User
类,它有一个检索用户相关行程的方法。
它可以返回一个Trip
数组,其本身具有受邀用户的引用:
class User {
private $id;
public function __construct($id) {
$this->id = $id;
}
public function getTrips() {
$trips = array();
// Run your query using $this->id to build the WHERE clause
return $trips;
}
}
class Trip {
// Array of User objects invited to the trip
private $invited = array();
// Other methods here to add/retrieve invited users
}
$user = new User(1);
foreach ($user->getTrips() as $trip) {
// Do something with $trip
}
理想情况下
User
实例将存储在会话中