【问题标题】:What prevents me from adding a row with foreign key value?是什么阻止我添加具有外键值的行?
【发布时间】:2015-05-21 07:02:03
【问题描述】:
1452 Cannot add or update a child row: a foreign key constraint fails (`bpr`.`trips`, CONSTRAINT `trips_driver_user_id_foreign` FOREIGN KEY (`driver_user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE)

是错误。

通过 MySQL 手动添加一行可以正常工作。如果我通过我的应用程序来做 - 不。

我试图插入的id 是正确的(它存在并且是一个整数)。我检查了外键和东西,一切看起来都很好。不知道是什么问题...

一些代码:

 $input = Input::all();

 Trip::create([
                'route_from'       => $input['route_from'],
                'route_to'         => $input['route_to'],
                ... adding other stuff ...
                'driver_user_id'   => Auth::user()->id
            ]);

当我var_dump(Auth::user()->id) 时,我确实得到了正确的int 号码,这是某个用户正确对应的ID。

在 Trip 模型中:

protected $hidden = [
    'id'
];
protected $fillable = [
    'route_from',
    'route_to',
    ... 
    'driver_user_id'
];
public function Trip()
{
    return $this->belongsTo('User', 'driver_user_id', 'id');
}

在用户模型中:

public function Trips()
{
    return $this->hasMany('Trip');
}

【问题讨论】:

  • 我们能看到代码吗?或者你正在使用什么框架等等,只是更多的信息
  • @IkoTikashi - 完成。 :)
  • 看这里,希望对你有帮助:stackoverflow.com/questions/20705539/…
  • @IkoTikashi - 这对我没有帮助。在尝试插入旅行行并将其链接到用户之前,我已经在数据库中创建了特定用户的行。否则我将无法从Auth:: 获得它的id
  • 对不起,应该更彻底地阅读。在这里我帮不了你,对不起:(

标签: php mysql laravel laravel-4


【解决方案1】:

我有直觉认为这些属性是被保护的。您的代码似乎正确,但是您收到的错误来自数据库。你可以这样试试看是否有效:

$trip = new Trip;
$trip->unguard();
$trip->fill([
            'route_from'       => $input['route_from'],
            'route_to'         => $input['route_to'],
            ... adding other stuff ...
            'driver_user_id'   => Auth::user()->id
        ]);
$trip->save();

在模型上使用create 方法会使调试发生的事情变得困难。

【讨论】:

  • 好的,成功了!请您详细说明一下,旅行被看守的问题是什么?我是否一定需要unguard 整个Trip 对象,因为其中包含id 字段.. 它是敏感数据?我可以将driver_user_id 字段放在hidden 中,因为它是敏感数据吗?在这种情况下一般发生了什么?提前致谢!
  • 您已经使用 $fillable 来使属性可访问(请参阅laravel.com/docs/5.0/eloquent)。然而,从过去的经验中知道它似乎行为不端。所以我总是先实例化对象,解除保护、填充、重新保护和保存。而且解除保护似乎只在当前对象级别有效。
  • 进一步检查代码后,您的对象并未完全受到保护,否则会出现 MassAssignmentException。你使用的是哪个版本的 laravel?
  • 我用的是4.2版本。
  • 我发现了这个:...如果没有指定fillable,并且密钥没有在guarded属性中列出,框架会假设密钥可以安全地传出-分配。听起来非常好,应该是意料之中的,但是当我们包含一个不是表字段的属性时,它会导致错误,因为框架会尝试将数据插入到不存在的列中。 在这里:hndr.me/blog/… 很有帮助。 :)
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多