下面是我的 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 时。
我可以知道我哪里做错了吗?
谢谢
更新 [2015-05-27 16:02]: 在我 TRUNCATE 表并将 sess 字段设置为 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/