mysql - Laravel 5 insert 无需 $fillable 即可工作
问题描述
我有一个别人制作的 Laravel 应用程序。
在控制器中我有这个:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Result;
class StoreInDB extends Controller
{
function store($uuid, $session){
// Insert data
$r = new Result;
if($r->updateOrInsert(['user_id' => $uuid], ['user_id' => $uuid, 'answers' => $session])){
return true;
}
else{
return false;
}
}
}
在模型结果中我有这个:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Result extends Model
{
//
}
为什么它有效?没有 $fillable 可以告诉您可以使用哪一列来插入。
数据被插入。但为什么?我唯一的问题是 created_at 和 updated_at 为空。
解决方案
updateOrInsert使用查询构建器而不是 eloquent,因此它不会触发模型事件或尊重guarded
orfillable
属性,也不会填充created_at
andupdated_at
列。
如果你想使用上面提到的 eloquent 特性,你应该使用updateOrCreate。
像这样的东西:
public function store($uuid, $session)
{
if (null === Result::updateOrCreate(['user_id' => $uuid], ['answers' => $session])) {
return false;
}
return true;
}
请注意,它updateOrCreate
返回一个模型实例并updateOrInsert
返回一个boolean
.
有时,如果不存在匹配的模型,您可能需要更新现有模型或创建新模型。和
firstOrCreate
方法一样,updateOrCreate
方法持久化了模型,所以不需要手动调用save方法。在下面的示例中,如果存在
departure
位置为Oakland
和destination
位置的航班San Diego
,则其price
和discounted
列将被更新。如果不存在这样的航班,将创建一个新航班,该航班具有将第一个参数数组与第二个参数数组合并后的属性:
$flight = Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99, 'discounted' => 1]
);
有时您可能想要更新数据库中的现有记录,或者在不存在匹配记录时创建它。在这种情况下,
updateOrInsert
可以使用该方法。该updateOrInsert
方法接受两个参数:查找记录的条件数组,以及指示要更新的列的列和值对数组。该
updateOrInsert
方法将尝试使用第一个参数的列和值对来定位匹配的数据库记录。如果记录存在,它将使用第二个参数中的值进行更新。如果找不到记录,将插入一条新记录,其中包含两个参数的合并属性:
DB::table('users')
->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);
推荐阅读
- command-line - 将命令行参数写入文件
- c++ - 同时使用大端和小端的舒适方式?
- javascript - 在材料设计中的登录表单自动填充的标签字段中没有添加活动类?
- typescript - 选中/取消选中时如何选中/取消选中离子选择中的所有选项选择ionic3中的所有选项
- python - 我的 tf.Graph 中的修改改变了我的 NN 权重初始化
- c# - 如何从 C# 对象的动态视图中获取动态成员?
- html - 我正在使用弹性框来显示标签和输入文件。如何让它响应?
- typescript - Jest + Typescript + 绝对路径(baseUrl)给出错误:找不到模块
- python - 如何删除我通过 pip 安装且没有 virtualenv 的所有软件包?
- image - 使用 OpenCV 获取图像相交的坐标