Eloquent 关系在邮件中不起作用

Eloquent relationship not working in mail

我有一个订单、产品和订单产品模型。 Order 与 Products 有 belongsToMany 关系,如

public function products(){
        return $this->belongsToMany('App\Product')->withPivot('group');
}

所以用户在数据库中创建了一个订单:

$order = Order::create([
                    'order_id' => $payment->metadata->order_id,
                    'user_email' => $request ->email,
]);

并且我们还保存了产品(注意它们与订单具有相同的 order_id):

foreach (Cart::content() as $item){
                    OrderProduct::create([
                        'order_id' => $payment->metadata->order_id,
                        'product_id' =>$item->model->id,
                        'group' => $item->options->group,
                    ]);
                }

然后我想发送一封电子邮件,其中包含从数据库中检索到的订单信息和产品信息,这在我的 webhook 文件中,付款后会发送一封电子邮件:

      //Let's send an email.
      $order = Order::where('order_id', '=', $payment->metadata->order_id)->firstOrFail();
      Mail::send (new OrderPlaced ($order));

电子邮件通过输出 {{$order->order_id}} 和 {{$order-> 在我看来显示了所有订单信息,如 order_id 和 user_email user_email}} 但是当我尝试使用以下方法循环时我没有看到这些产品:

@foreach ($order->products as $product) {{$product->name}} @endforeach

只是 returns 没有,没有错误,没有。 add ($product) returns 没什么。我在这里忽略了什么?

我的想法:
1. 我没有使用 id 作为主键,所以我可能需要在 belongsToMany 关系中指定第二个和第三个参数?
2. Mail之前定义的$order变量,可能我这里看不到关系?

为了获得产品关系数据,您必须先加载它:

 $order = Order::with('products')->where('order_id', '=',$payment->metadata->order_id)->firstOrFail();

有关加载关系的更多详细信息:

https://laravel.com/docs/7.x/eloquent-relationships#eager-loading

所以我想通了,也许其他人有时会遇到同样的问题: 我的外键在迁移中没有设置正确。所以修复外键然后做一个 php artisan migrate refresh 解决了它。