如何在 laravel 7 中的 3 个表之间创建关系?

How to create a relation between 3 tables in laravel 7?

我在数据库中有三个 table。 第一个是“预订”,包含一些列:id、customer_id 等。 第二个是“客户”,有 id、姓名、电子邮件等。

第三个是“customer_meta”,id为object_id(引用“客户”table中的id列),meta_key 和 meta_value。它包含有关客户的其他数据,如出生日期、护照号码、性别等。 此 table 中的每一行都是针对特定客户的不同条目,例如:

id object_id meta_key meta_value
1 1 cf_x4rMBfn3 10/11/1989
2 1 cf_x4rMBfb5 1234567
3 1 cf_x4rMB735 M

我在预订和客户之间创建了一对多关系 table。这是我控制器中索引函数的代码。

public function index()
{
    
    $bookings = Booking::with('customer')->get();
   
    return view('bookings', [
        'bookings' => $bookings,
    ]);

}

一切正常。我可以像这样在 blade 文件中显示数据:

<tbody>
    
        @foreach ( $bookings as $booking )
            <tr>
                <td>{{ $booking->id }}</td>
                <td>{{ $booking->start_date }}</td>
                <td>{{ $booking->customer->first_name }}</td>
                <td>{{ $booking->customer->last_name }}</td>
            </tr>
        @endforeach

    </tbody>

现在我想访问“customer_meta”中的数据。我似乎无法弄清楚“预订”table 和“customer_meta”table 之间的关系类型。我想通过包含 customer_id.

的“预订”显示特定客户的所有行

如果您设置客户与 customer_meta 之间的关系,您应该可以像

一样访问它
class Customer extends Model
{
    public function customerMeta()
    {
        return $this->hasMany(App\Models\CustomerMeta::class, 'object_id', 'id');

    }
}


$bookings = Booking::with('customer', 'customer.customerMeta')->get();     
...
        
{{ $booking->customer->customerMeta->meta_key }}

如果您想直接从预订记录访问 customer_meta,您可以使用 'has one through' 或 'has many through' 关系 参见 https://laravel.com/docs/7.x/eloquent-relationships#has-one-through

这样您可以直接从预订记录customer_meta访问

class Booking extends Model 
{
    public function customerMeta()
    {
      return $this->hasOneThrough(App\Models\CustomerMeta::class, App\Models\Customer::class);
    }
}