📜  仅向用户显示他没有购买的产品 laravel eloquent - PHP (1)

📅  最后修改于: 2023-12-03 15:06:28.607000             🧑  作者: Mango

仅向用户显示他没有购买的产品 Laravel Eloquent

在很多电子商务应用程序中,有时我们需要根据用户购买历史记录来显示推荐产品。但是,有时我们需要仅向用户展示他们没有购买过的产品。这个问题可以使用 Laravel Eloquent 来解决。

一、获取用户购买历史记录

要获取用户购买历史记录,我们需要创建两个模型,一个是用户模型,另一个是购买历史记录模型。这两个模型之间的关系可以是一对多关系。

class User extends Model
{
    public function purchaseHistory()
    {
        return $this->hasMany(PurchaseHistory::class);
    }

    // ...
}

class PurchaseHistory extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    // ...
}

然后,我们可以使用以下代码获取用户购买历史记录:

$user = User::find($userId);
$purchasedProducts = $user->purchaseHistory->pluck('product_id');
二、获取未购买产品

获取未购买产品,我们可以使用 Eloquent 的 whereNotIn 方法。这个方法可以接收一个数组参数,表示我们要排除的 ID 列表。

$products = Product::whereNotIn('id', $purchasedProducts)->get();
三、返回 Markdown 格式

为了返回 Markdown 格式的数据,我们可以使用 league/commonmark 扩展包来将数据转换为 Markdown 格式。

use League\CommonMark\CommonMarkConverter;

$products = Product::whereNotIn('id', $purchasedProducts)->get();

$converter = new CommonMarkConverter();

$markdown = '';

foreach ($products as $product) {
    $markdown .= "- {$product->name}\n";
}

return $converter->convertToHtml($markdown);
四、完整代码片段
use App\Models\User;
use App\Models\Product;
use League\CommonMark\CommonMarkConverter;

function getUnpurchasedProducts($userId)
{
    $user = User::find($userId);
    $purchasedProducts = $user->purchaseHistory->pluck('product_id');

    $products = Product::whereNotIn('id', $purchasedProducts)->get();

    $converter = new CommonMarkConverter();

    $markdown = '';

    foreach ($products as $product) {
        $markdown .= "- {$product->name}\n";
    }

    return $converter->convertToHtml($markdown);
}

返回的 Markdown 代码片段:

- Product Name 1
- Product Name 2
- Product Name 3

这个代码片段表示用户没有购买产品名称为 “Product Name 1”、“Product Name 2” 和 “Product Name 3” 的产品。