Laravel - 软删除无效

3

我在软删除方面遇到了问题。我的应用程序具有一个功能,用户可以收藏关注的属性广告。他们也可以取消收藏。

这个功能运作良好。当他们取消收藏时,记录被软删除。delete_at时间戳会更新。

然而,如果用户尝试再次收藏,我会收到一条消息,说该属性已经被点赞/收藏过。所以软删除被忽略了?有什么想法吗?

StarredPropertyModel

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class StarredProperty extends Model
{
    use SoftDeletes;

    protected $fillable = ['property_id', 'user_id'];

    public function scopeStarredProperty($query, $propertyId, $userId)
    {
        return $query->where('property_id', $propertyId)->where('user_id', $userId)->first();
    }
}

StarredPropertyController

class StarredPropertyController extends Controller
{
    public function star(Property $property, User $user, Request $request)
    {     
        if(!$user->starredProperties()->starredProperty($property->id, $user->id))
        {
            return response()->json(StarredProperty::create(['property_id' => $property->id, 'user_id' => $user->id]));
        }

        return response()->json('You have already like this property');
    }

    public function unstar(Property $property, User $user, Request $request)
    {
        $starredProperty = $user->starredProperties()->starredProperty($property->id, $user->id);

        if($starredProperty->exists())
        {
            $starredProperty->delete();
        }
    }
}
1个回答

4
你漏了一个->get(),需要在检查star函数中是否存在starredProperty的if语句末尾添加。 $user->starredProperties()->starredProperty($property->id, $user->id)返回一个查询,而不是记录。要获取记录,仍然需要执行get,如果没有记录,则从get返回的值将为null

1
StarredProperty是我第一个代码块中模型的查询范围。该查询返回第一个记录。 - user11341032
你不应该在作用域上这样做,作用域应该返回查询构建器实例,请查看此答案:https://laracasts.com/discuss/channels/laravel/make-query-scope-only-return-one-object - namelivia
非常感谢。所以我不应该在作用域中使用first或get吗? - user11341032
不,作用域只是用来链接形成复杂查询的,一旦您通过在控制器上链接作用域形成查询,您可以调用get或first来实际执行所有链接作用域所做的查询。 - namelivia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接