【问题标题】:Check if laravel model got saved or query got executed检查 laravel 模型是否已保存或查询是否已执行
【发布时间】:2015-03-08 19:12:23
【问题描述】:

我见过很多人使用这种方式来检查 laravel 模型是否被保存。所以现在我想知道这是否是一种安全的方式。

我也可以检查下面的查询是否像这样执行

检查模型是否保存

例如:

$myModel = new User();

$myModel->firstname = Input::get('firstname');
$myModel->lastname = Input::get('lastname');

$myModel->save();

//Check if user got saved
if ( ! $myModel->save())
{
  App::abort(500, 'Error');
}

//User got saved show OK message
return Response::json(array('success' => true, 'user_added' => 1), 200);

上述方法是否可以安全地检查我的模型是否已保存?

检查查询是否返回结果

例如:

$UserProduct = Product::where('seller_id', '=', $userId)->first();

if (! $UserProduct)
{
    App::abort(401); //Error
}

如果没有找到产品,上述是否会返回错误?

检查查询是否被执行

例如:

$newUser = User::create([
        'username' => Input::get('username'),
        'email' => Input::get('email')
]);

//Check if user was created
if ( ! $newUser)
{
    App::abort(500, 'Some Error');
}


//User was created show OK message
return Response::json(array('success' => true, 'user_created' => 1), 200);

上面是否检查用户是否已创建?

【问题讨论】:

    标签: php mysql validation laravel model


    【解决方案1】:

    检查模型是否保存

    save() 将返回布尔值、已保存或已保存。所以你可以这样做:

    $saved = $myModel->save();
    
    if(!$saved){
        App::abort(500, 'Error');
    }
    

    或者直接保存在if:

    if(!$myModel->save()){
        App::abort(500, 'Error');
    }
    

    请注意,像您的示例中那样连续两次调用save() 是没有意义的。顺便说一句,许多使模型无法保存的错误或问题无论如何都会引发异常......

    检查查询是否返回结果

    first() 将在未找到记录时返回 null,以便您的检查可以找到。但是,作为替代方案,您也可以使用firstOrFail(),它会在找不到任何内容时自动抛出ModelNotFoundException

    $UserProduct = Product::where('seller_id', '=', $userId)->firstOrFail();
    

    find()findOrFail() 也是如此)

    检查查询是否被执行

    不幸的是,create 并不那么容易。这是来源:

    public static function create(array $attributes)
    {
        $model = new static($attributes);
    
        $model->save();
    
        return $model;
    }
    

    如您所见,它将使用$attributes 创建模型的新实例,然后调用save()。现在,如果save() 在哪里返回true,您将不知道,因为无论如何您都会获得模型实例。例如,您可以检查模型 ID(因为仅在保存记录并返回新创建的 ID 后才可用)

    if(!$newUser->id){
        App::abort(500, 'Some Error');
    }
    

    【讨论】:

    • 谢谢!所以我可以使用 $newUser = User::create([values..]) 然后使用 $newUser->id 检查它是否被插入?
    • 是的。除非您手动设置 id,否则它将为空,直到数据成功插入您的数据库。
    【解决方案2】:
    /**
     * Store a newly created country in storage.
     *
     * @url /country
     * @method POST
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(Request $request)
    {
      # Filer & only get specific parameters.
      $request = $request->only('code', 'name', 'status');
    
      # Assign login user(Auth Control).
      $request['created_by'] = Auth::user()->id;
    
      # Insert data into `countries` table.
      $country = Country::create($request);
    
      if(!$country)
        throw new Exception('Error in saving data.');
    }
    

    【讨论】:

    • 您确定@ShankaSMS $country 确实意味着该国家/地区已成功插入吗? create 方法返回模型的一个实例,但它没有说或确认它已被持久化在数据库中。
    【解决方案3】:

    您还可以检查模型上的public 属性$exists

    if ($myModel->exists) {
        // Model exists in the database
    }
    

    【讨论】:

      【解决方案4】:

      当我使用Model::create 方法时,我会这样做:

      $activity = Activity::create($data);
      
      if ($activity->exists) {
         // success
      } else {
         // failure 
      }
      

      至于 Save 方法更简单,因为 $model->save() 返回 Bool

      $category = new Category();
      $category->category_name = $request->category_name;
      $is_saved = $category->save();
      
      if ($is_saved) {
          // success
      } else {
          // failure 
      }
      

      【讨论】:

      • 如果用户尝试插入 dup val,则在返回创建之前将引发异常。然后没有必要检查响应。您必须先处理异常。
      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2023-03-13
      • 2014-07-22
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多