Laravel - 从没有主键的表中删除单个记录

时间:2016-08-31 13:53:51

标签: php mysql laravel

我的桌子没有'primary ID',例如。

| user_id | point_id | created_at | updated_at |  

+ ---------- + ---------- + --------------- + -------- ------- +
我有记录:

1 ..| 200 | (date) | (date)  
14 | 300 | (date) | (date)  
1 ..| 200 | (date) | (date)  

现在我想只删除一条记录:

1 ..| 200 | (date) | (date)  
14 | 300 | (date) | (date)  
I tryied:  

UserPoint::where( 'point_id', $reqId )->where( 'user_id', $userId )->first()->delete();

但它总是用这个参数删除所有记录......任何人都可以提供帮助吗? 编辑:我的用户点模型

use Illuminate\Database\Eloquent\Model;

class UserPoint extends Model {

    protected $table = 'point_user';

    public function scopeUsed($query){
        return $query->where('amount', '<', 0);
    }

    public function scopeEarned($query){
        return $query->where('amount', '>', 0);
    }

    public function about(){
        return $this->hasOne('\App\Point', 'id', 'point_id');
    }

}

1 个答案:

答案 0 :(得分:0)

您尝试实现此删除的方式有些错误,因为它不遵循数据完整性规则。在您的情况下删除子表会强加我们所谓的孤立表。

在这种情况下,删除该记录的正确方法是先将此表与其父相关表关联起来,如下所示:

Class User extends Model { 

  public function points() {

    return $this->hasMany(UserPoint::class)

  }
}

然后在UserPoint类或模型中,您需要映射关系。

class UserPoint extends Model {

protected $table = 'point_user';
// I have added this part
public function users() {
  return $this->belongsTo(User::class)
}

public function scopeUsed($query){
    return $query->where('amount', '<', 0);
}

public function scopeEarned($query){
    return $query->where('amount', '>', 0);
}

public function about(){
    return $this->hasOne('\App\Point', 'id', 'point_id');
}

}

这样,您在删除模型或项目时只需执行以下操作: //将您的User注入构造函数或函数中-假设您将其命名为User $ user

$user->points->delete();

我建议您在以这种方式处理关系时也要查看Eloquent的关联和同步方法,因为您始终知道相关模型处于同步状态,并且数据库中没有孤儿,这在企业设计中是一个巨大的问题,因为准确性和数据完整性就是一切。