雄辩的ORM关系 - 是默认的“无关系”?

时间:2014-02-23 18:04:53

标签: orm laravel-4 relationship eloquent

我正在构建一个应用程序来保存旅行预订信息,并且在我开始使用Laravels ORM之前想询问一些小事。

假设有一群旅行者预订了机票,那太好了。他们还想购买我们的酒店预订。购买酒店预订是一种选择,团体不必购买酒店预订。

所以我将以下设置为我的数据库:

Table Group:
Group_ID
Name
etc

Table Hotel_Bookings:
Group_ID
Hotel name
Number of people
Number of rooms
Type of rooms
etc

我知道我可以定义一个关系,例如:

class Group extends Eloquent {

    public function hotel_bookings()
    {
      return $this->hasOne('hotel_bookings');
    }
}

class Hotel_bookings extends Eloquent {

    public function group()
    {
      return $this->belongsTo('group');
    }
}

但是如果一个团体没有决定和我们预订酒店怎么办?在这种情况下,hotel_bookings表中没有与该组相关联的酒店预订行。 ORM是否会意识到表中没有这样的行,是否会吐出错误或什么都不做?

是一对一关系,第一个表中有一行与第二行中的一行有关吗?

希望你能说我是ORM的新手,如果能让我的数据库从一开始就更容易查询生活,我想了解更多。

2 个答案:

答案 0 :(得分:1)

“hasOne”或“hasMany”并不一定意味着必须拥有相关数据,这只是意味着可以

在这种情况下,Group表中的条目可以正常工作,无论是否有Hotel_booking条目附加到该条目。

另一方面,

Hotel_booking是“belongsTo”。假设您的数据库架构按预期反映了这种关系,Hotel_booking条目需要相关的Group条目。

答案 1 :(得分:1)

如果我理解你所说的你有一个可以有可选的Hotel_bookings的小组(查看Laravel命名约定,请使用HotelBooking或Hotelbooking)。您建立关系的方式不会导致任何错误。 ORM不会强制您在迁移过程中设置任何关系。

Schema::table(...function(Blueprint $table)
{
    ...
    $table->integer('group_id')->unsigned();
    $table->foreign('group_id')->references('id')->on('groups');

这就是强制HotelBooking必须属于一个组的原因。 Eloquent不会自动为您提供检索Group的HotelBooking的查询,它要求您使用以下内容进行查询:

$group = Group::with('hotel_bookings')->first();

这也不会引发错误,$ group-> hotel_bookings只会为空。