gpt4 book ai didi

php - 使用复合键软删除/分离和恢复/附加关系

转载 作者:行者123 更新时间:2023-12-03 22:37:27 24 4
gpt4 key购买 nike

我有 2 个模型,它们由具有复合键的关系连接 - 这些是产品和类别。我需要对所有表使用软删除,以便在需要时可以恢复模型和关系。

在我的产品模型中,我有:

function categories()
{
return $this->belongsToMany('App\Category', 'product_categories')->whereNull('product_categories.deleted_at')->withTimestamps();
}

在我的类别模型中,我有:
function products()
{
return $this->belongsToMany('App\Product', 'product_categories')->whereNull('product_categories.deleted_at')->withTimestamps();
}

我在别处阅读了有关链接 whereNull 方法的内容,如 $category->products->contains($product->id) 之类的查询否则返回软删除的关系。

我的问题是处理删除和恢复这些软删除关系的最佳方法是什么?例如,对于恢复,我尝试过:
$product->categories()->restore($category_id);

上面产生了一个 SQL 错误,指出deleted_at 字段不明确(因为它将categories 表连接到product_categories)。

更新 - 看来根本问题是 BelongsToMany 类不支持软删除 - 所以附加、分离和同步都执行硬删除。覆盖此类的最佳方法是什么?

最佳答案

基本上只有一个deleted_at字段,而不是使用 $product->categories()例如,在( ProductCategory )模型中使用两个自定义(通用)方法,您可以创建这样的特征:

// SoftDeletePC.php
trait SoftDeletePC {
// SoftDelete
public function softDeleteProductCategory($productId, $categoryId)
{
\DB::table('product_categories')
->where('product_id', $productId)
->where('category_id', $categoryId)
->update(['deleted_at' => \DB::raw('NOW()')]);
}

// Restore
public function restoreProductCategory($productId, $categoryId)
{
\DB::table('product_categories')
->where('product_id', $productId)
->where('category_id', $categoryId)
->update(['deleted_at' => null]);
}
}

然后使用 use TraitProductCategory 在两个模型中使用此特征并从两个模型调用该方法,例如:

// App/Product.php
class product extends Model {
use SoftDeletePC;
}

// App/Category.php
class Category extends Model {
use SoftDeletePC;
}

所以,而不是使用这个:

Product->find(1)->categories()->restore(2);

你可以使用这样的东西:

$product = Product->find(1);

$product->softDeleteProductCategory(1, 2); // Set timestamp to deleted_at

$product->restoreProductCategory(1, 2); // Set null to deleted_at

希望这对你有用。

关于php - 使用复合键软删除/分离和恢复/附加关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com