我正在开发一个php web应用程序,用户可以在其中创建到目的地的旅行,并邀请其他用户参加这些旅行。
我有用于DestinationsTripsUsers的mysql表,还有一个名为Invites的表来解决UsersTrips之间的多对多关系。
对于每个表,我都在应用程序中创建了一个类(因此Destinations是一个类,Trips是一个类,等等)。我已经为这些类中的每一个编写了一个静态函数,它允许从mysql查询中实例化对象及其属性(因此从SELECT *查询返回的每一行都会导致实例化对象并分配属性)。
我试图创建一个页面,我的用户可以在其中查看他们计划的所有旅行的详细信息。此页将显示目的地(fromDestinations)、行程详细信息(例如date fromTrips)和他们邀请的用户的详细信息(例如username fromUsers),并将所有这些数据放在html表中,其中每个行程都是一行。
为了实现这一点,到目前为止,我已经实例化了与用户的Tripsuser_idDestinations相关的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实例将存储在会话中

10-01 08:32