问题描述
在控制器中我有这个:
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
或 fillable
属性,也不会填充 created_at
和 { {1}} 列。
如果你想使用上面提到的 eloquent 特性,你应该使用 updateOrCreate。
像这样:
updated_at
请注意,public function store($uuid,$session)
{
if (null === Result::updateOrCreate(['user_id' => $uuid],['answers' => $session])) {
return false;
}
return true;
}
返回一个模型实例,而 updateOrCreate
返回一个 updateOrInsert
。
有时,您可能需要更新现有模型或创建新模型
如果不存在匹配的模型,则模型。像 boolean
方法一样,
firstOrCreate
方法会保留模型,因此无需
手动调用保存方法。
在下面的示例中,如果存在位置为 updateOrCreate
的航班
departure
和 Oakland
的 destination
位置,其 San Diego
和 price
列将被更新。如果不存在这样的航班,则
将创建具有以下属性的新航班
将第一个参数数组与第二个参数数组合并:
discounted
有时您可能希望更新数据库中的现有记录或
如果不存在匹配的记录,则创建它。在这种情况下,
可以使用 $flight = Flight::updateOrCreate(
['departure' => 'Oakland','destination' => 'San Diego'],['price' => 99,'discounted' => 1]
);
方法。 updateOrInsert
方法
接受两个参数:一个条件数组,通过它可以找到
记录,以及指示列的列和值对数组
待更新。
updateOrInsert
方法将尝试定位匹配的数据库
使用第一个参数的列和值对记录。如果
记录存在,它将用第二个中的值更新
争论。如果找不到该记录,则会创建一条新记录
插入两个参数的合并属性:
updateOrInsert