我正在使用Laravel 5.8进行一个在线store 项目,在这个项目中,我想为用户添加"Add to favourites"个功能,以便将产品添加到他们最喜欢的列表中.

所以我创建了一个这样的模型:

class FavouriteProduct extends Model
{
    protected $table = 'favourite_products';
    protected $fillable = ['usr_id','prd_id'];

    public function users()
    {
       return $this->belongsToMany(User::class, 'favourite_products', 'id', 'usr_id');
    }

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

在产品模型中,我添加了以下内容:

public function favourites()
    {
        return $this->belongsToMany(Product::class, 'favourite_products', 'prd_id', 'id');
    }

以下是用户模型:

public function favourites()
    {
        return $this->belongsToMany(FavouriteProduct::class, 'favourite_products', 'usr_id', 'id');
    }

现在我想确保我已经正确地建立了关系.所以如果你知道这是正确的还是错误的,请告诉我,我将非常感激...

推荐答案

首先,一个选项是删除FavouriteProduct型号,但保留favourite_products表格.(这是我的建议).

或者,你也可以将FavourteProduct改为Pivot而不是Model,并将->using(FavouriteProduct::class)添加到UserProduct上两个最喜欢的关系中.

下面我将详细介绍这两种方法.


Option 1:个简单的关系

如果你同意我的第一个建议,你需要做以下修改.

Product型号上,您需要添加以下关系:

public function favouritees()
    {
        return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id')
            ->withTimestamps();
    }

User型号上,您需要添加以下关系:

public function favourites()
    {
        return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id')
            ->withTimestamps();
    }

现在,您只需执行以下操作即可添加Collection 夹:

$user = User::find($userId);
$product = Product::find($productId);

$user->favourites()->save($product);

Option 2: a more complex Pivot model

如果您打算在两个模型之间的Pivot个关系中添加其他信息和关系,最好只使用pivot选项.

就像Product型号的一样

public function favouritees()
        {
            return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id')->using(FavouriteProduct::class);
        }

就像User型号的一样

public function favourites()
    {
        return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id')->using(FavouriteProduct::class);
    }

但我建议你开始使用一种更为标准的方法;它带来了巨大的好处,包括当一个人还在学习时,仍然能够遵循文档中的示例.

使用usr_idprd_id这样的专栏除了让你的生活更艰难之外,真的没有什么区别.如果你使用user_idproduct_id,你就不需要把它们传给每一段恋人,告诉拉雷夫你决定用你的约定来代替拉雷夫.

Laravel将自动假定这些关系,因此如果您添加belongsToMany,它将查看在其上实现的类,在本例中是User::class,它将自动使用键user_id.它还将查看关系中的类,例如Product::class,并使用product_id.当然,也就是说,除非你告诉它使用你已经做过的特定的东西.

最终,您可以自由地这样做,有时您会从其他地方继承数据库,并被迫这样做.

Php相关问答推荐

如何使用这种格式构建XML?

使用正则表达式搜索两个子字符串(没有重叠/共享字符)

使用PHP curl的Amazon SP API批处理调用

如何将隐式乘法添加到PHPPEG基本计算器语法中?

PHP MySQL求和子树并与父树累加

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

目标类[Set_Locale]不存在.拉威尔

在PHP中,如何将介于0和1之间(包括0和1)的浮点概率转换为数组索引?

筛选器具有多个查询之一

在Laravel中从动态嵌套数组中获取值

表单提交返回空白页

使用 php Carbon 获取两个日期之间的随机日期和时间

在 Heroku 上部署 Sylius - 路由不正确

根据所选付款方式更改 WooCommerce 提交结帐按钮文本

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

PHP / DOM : 解析 HTML 以提取基于类的数​​据

Laravel Docker 几个数据库

我正在使用 Baryryvdh/laravel-snappy 从 HTML 导出 PDF 它正在工作但缩小了 pdf 文件

特定小写 php 验证的正则表达式匹配

解析错误:语法错误,文件 PHP 代码意外结束