laravel 模型文件名更改数据库中的表名

j2cgzkjk  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(172)

你好,我有一个名为order_product的表,我想从中获取值,该表的模型名为order_product,值为:

public $timestamps = false;

    protected $fillable = [
        'order_id',
        'product_id',
        'amount',
    ];

这是型号Order的代码:

public $timestamps = true;

    protected $fillable = [
        'order_number',
        'client_id',
        'description',
    ];

    public function client()
    {
        return $this->belongsTo(Client::class);
    }

    public function products()
    {
        return $this->belongsToMany(Product::class);
    }

    public function orders()
    {
        return $this->belongsToMany(order_product::class);
    }

一个专业的家伙帮助我,向我解释了关系是如何工作的,所以clientproducts工作得很好,但orders在sql中出错。
这是我在控制器中执行的代码:

$orders = Order::where('id', $id)->firstOrFail();
$orders->load('client', 'products','orders');

我得到的错误是:

    • 数据库状态[42S02]:未找到基表或视图:1146表格'user_project_db. order_products'不存在**

文件order_product的名称应该是什么才能正确执行查询?

f8rj6qna

f8rj6qna1#

我在阅读下面的答案后更改了我的答案。
您的表关系是orders-order_product-products
https://webdevetc.com/blog/laravel-naming-conventions/
数据透视表
您命名数据透视表的方式已经正确。
order_product是以多对多的方式将orders连接到products
所以我想你可以试着做以下几点。
在模型产品内部添加此关系。

public function orders() 
{
   return $this->belongsToMany(Order::class, 'order_product');
}

在模型Order中添加其他连接

public function products() 
{
   return $this->belongsToMany(Product::class, 'order_product');
}

belongsToMany接受2个参数,第一个是模型目标,第二个是表透视名称,在本例中为order_product
在这种情况下,额外的模型OrderProduct是可选的。
要将产品添加到订单中,可以使用attach

$order = Order::find($order_id);
 $order->products()->attach($product_id);

或者,如果透视表中有额外字段

// first implement this change inside Order model

return $this->belongsToMany(Product::class, 'order_product')
   ->withPivot('price', 'qty');

// to attach for example price and qty
$order->products()->attach($product_id, ['price' => 200', 'qty'=> 1]);

查询价格

$order_product = $order->products()
   ->where('product_id', $product_id)
   ->first()->pivot;
$price = $order_product->price;
$qty = $order_product->qty;

然后回到您自己的查询。
无需在Order模型中添加orders()。
并且只加载前2个关系应该就足够了。
$order->load('clients', 'products');

83qze16e

83qze16e2#

模型中的protected $table = 'order_products;将告诉Laravel Order模型的数据以该名称存储在表中。
但是,通常您会有一个订单模型、一个产品模型和一个名为order_products的 * 透视表 *(如果需要,可能还带有透视模型)。https://laravel.com/docs/9.x/eloquent-relationships#defining-custom-intermediate-table-models

相关问题