php - Laravel 5 firstOrCreate keep create even set unique to the field

标签 php mysql laravel model laravel-5

下面是我的 app\Cart.php

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Cart extends Model {
    use SoftDeletes;
    protected $table = 'cart';
    protected $fillable = ['sess','uid'];
}

下面是我的app\Http\Controllers\CartController.php

public function cart($id=0, $act, Request $request)
    {
        $sessId = Session::getId();
        switch($act){
            case 'Add':
                $quantity = $request->only('p_quantity');
                $data = $request->except('p_quantity');
                $cartId =  Cart::firstOrCreate(['sess' => $sessId,'status' => 1]);
            break;

            case 'Delete':

            break;
        }

        return response()->json(['success' => true,'message' => 'Success', 'act' => $act, 'id' => $id ,'data' => $data, 'quantity'=> $quantity, 'cart'=>$cartId->id]);
    }

我想要的是检查数据库是否 session key 存在于表 cart.sess 中,否则创建一个新的并获取 ID。

问题是,当它不断创建到数据库的新重复 session 时。

Cart Table

我可以知道我哪里做错了吗?

谢谢

更新 [2015-05-27 16:02]: 在我 TRUNCATE 表并将 sess 字段设置为 Unique 之后,第一次提交看起来没问题,第二次提交时显示错误如下: After change to unique

更新 [2015-05-27 16:16] 我用来创建数据库的代码:

CREATE TABLE IF NOT EXISTS `cart` (
  `id` int(11) NOT NULL,
  `uid` int(11) DEFAULT NULL,
  `sess` varchar(40) NOT NULL,
  `status` int(11) DEFAULT '1',
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `deleted_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

最佳答案

在您创建此购物车表的数据库架构中,sess 列应该是唯一的,但事实并非如此。你应该改变它,使其独一无二:

$table->unique('sess');

不要忘记删除之前的所有记录,否则会报错。

编辑 在你发布你的表架构后我发现了问题

sess varchar(40) NOT NULL

您必须将 sess 的长度设置为至少 255 个字符或 session ID 的大小,因为您的 session ID 超过 40 个符号。 Laravel 试图找到一个包含 64 个字符(或者你的 session ID 的长度)的字符串,例如:

8a9f119eaea027def7268d12e4e4d680

但没有,所以它尝试插入新的。由于您的列长度为 40,因此 session ID 被截断为 40 个符号:

8a9f119eaea

在接下来的检查中它不会匹配,因为它正在搜索 8a9f119eaea027def7268d12e4e4d680 但在您的数据库中您得到了 8a9f119eaea

关于php - Laravel 5 firstOrCreate keep create even set unique to the field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30476215/

相关文章:

php - laravel 4 在哪里存储选择字段值?数据库还是数组?

php - 将索引 Controller 定义为 codeigniter 中的默认 Controller

mysql - PostgreSQL 转换日期 (YYYY-WW) 与 MySQL ('%x-%v' )

php - 从帖子中保存多个选定的列表框

javascript - 如何在我的 laravel 项目中添加自定义 javascript 文件?

php - Laravel 检查数组是否为空

laravel - 如何清理 Laravel Telescope 调试日志

php - fatal error : Cannot redeclare class CLASSNAME error already tried require_once()

javascript - 如何通过 AJAX 响应将值插入数组?

php - Azure devops - Release Pipeline 没有 PHP 7.2 for Runtime Stack 的选项,但 Azure App 服务有