如何在 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);
}
}
我在数据库中有三个 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);
}
}