【问题标题】:Laravel Checking If a Record ExistsLaravel 检查记录是否存在
【发布时间】:2015-01-21 14:09:27
【问题描述】:

我是 Laravel 的新手。请原谅新手的问题,但是如果记录存在,我该如何查找?

$user = User::where('email', '=', Input::get('email'));

我可以在这里做什么来查看$user是否有记录?

【问题讨论】:

  • 首先你需要在 $user 查询上执行 findOrFail() 或类似的操作
  • 这并没有什么帮助
  • 那它有什么作用呢?为什么没有帮助? $user = User::where('email', '=', Input::get('email')); 只是在$user 中创建一个查询,您需要执行该查询。 findOrFail() 是执行该查询的一种方式。 get() 是另一种方式,firstOrFail() 另一种方式
  • 如果一个建议“没有真正帮助”,请尝试说 为什么 它并没有真正帮助,因为这样意味着我们知道如何改进/更改该建议
  • 考虑这个i.imgur.com/ulqyOiw.png无需重新发明轮子

标签: php laravel laravel-5 eloquent conditional


【解决方案1】:

这取决于您是想事后与用户合作还是只检查是否存在。

如果你想使用用户对象,如果它存在:

$user = User::where('email', '=', Input::get('email'))->first();
if ($user === null) {
   // user doesn't exist
}

如果你只想检查

if (User::where('email', '=', Input::get('email'))->count() > 0) {
   // user found
}

甚至更好

if (User::where('email', '=', Input::get('email'))->exists()) {
   // user found
}

【讨论】:

  • 如果您针对不存在的记录调用exists(),则会出现错误:Call to a member function exists() on null
  • @Volatil3 你做错了什么。运行查询后不能调用存在
  • @lukasgeiter 猜你是对的。我已经打电话给first()
  • 我认为这是查找用户是否存在的更好方法。 User::where('email', '=', 'value')->count() > 0;
  • @Volatil3 我刚刚用 laravel 5.5 测试了 ->exists(),如果它不存在,它会说 false。
【解决方案2】:
if (User::where('email', Input::get('email'))->exists()) {
    // exists
}

【讨论】:

  • 这应该是公认的答案。最有效和最专注的方法是通过exists() 方法。
  • 我认为这是赢家。
【解决方案3】:

最好的解决方案之一是使用firstOrNewfirstOrCreate 方法。 documentation 有更多关于两者的详细信息。

【讨论】:

  • 虽然不适合这个问题,但仍然是非常有用的功能。两者之间的区别在于 firstOrNew 实例化模型的一个实例,而 firstOrCreate 会立即保存查询的模型,因此您需要更新 firstOrCreate 模型上的更改。
  • 是的,或者换一种思考方式是,如果您可以一次性传递所有属性(使用第二个参数),则使用 firstOrCreate,但是 firstOrNew 如果您在保存之前需要进一步的逻辑。
【解决方案4】:

在 laravel eloquent 中,默认有 exists() 方法,参考后面的例子。

if (User::where('id', $user_id )->exists()) {
    // your code...
}

【讨论】:

    【解决方案5】:
    if($user->isEmpty()){
        // has no records
    }
    

    Eloquent 使用集合。 见以下链接:https://laravel.com/docs/5.4/eloquent-collections

    【讨论】:

    • 是的,但它不返回集合。它返回一个模型对象,因为您会假设每个用户都有一个唯一的email,所以->isEmpty() 会抛出一个错误。
    • 如果我收到以下错误怎么办:Call to a member function isEmpty() on null
    【解决方案6】:

    Laravel 5.6.26v

    通过主键(email 或 id)查找现有记录

        $user = DB::table('users')->where('email',$email)->first();
    

    然后

          if(!$user){
                 //user is not found 
          }
          if($user){
                 // user found 
          }
    

    包括“use DB”和表名用户使用上面的查询变成复数,就像用户到用户一样

    【讨论】:

      【解决方案7】:
      if (User::where('email', 'user@email.com')->first()) {
          // It exists
      } else {
          // It does not exist
      }
      

      如果您只需要检查是否存在,请使用first(),而不是count()

      first() 更快,因为它会检查单个匹配项,而 count() 会计算所有匹配项。

      【讨论】:

        【解决方案8】:

        这将检查用户表中是否存在请求的电子邮件:

        if (User::where('email', $request->email)->exists()) {
           //email exists in user table
        }
        

        【讨论】:

          【解决方案9】:

          在您的控制器中

          $this->validate($request, [
                  'email' => 'required|unique:user|email',
              ]); 
          

          在您的视图中 - 显示已存在的消息

          @if (count($errors) > 0)
              <div class="alert alert-danger">
                  <ul>
                      @foreach ($errors->all() as $error)
                          <li>{{ $error }}</li>
                      @endforeach
                  </ul>
              </div>
          @endif
          

          【讨论】:

          • 最佳解决方案!但我需要更改表名并添加电子邮件列名:required|unique:users,email|email
          • 很好的解决方案。
          【解决方案10】:

          我用 empty() 函数解决了这个问题:

          $user = User::where('email', Input::get('email'))->get()->first();
          //for example:
          if (!empty($user))
              User::destroy($user->id);
          

          【讨论】:

            【解决方案11】:

            if 语句中检查 null 可防止 Laravel 在查询结束后立即返回 404。

            if ( User::find( $userId ) === null ) {
            
                return "user does not exist";
            }
            else {
                $user = User::find( $userId );
            
                return $user;
            }
            

            如果找到用户,它似乎会运行双重查询,但我似乎找不到任何其他可靠的解决方案。

            【讨论】:

            • 您可以将find 替换为whereUser::where(id, 1)-&gt;first()
            【解决方案12】:
            if ($u = User::where('email', '=', $value)->first())
            {
               // do something with $u
               return 'exists';
            } else {
              return 'nope';
            }
            

            可以使用 try/catch

            ->get() 仍然会返回一个空数组

            【讨论】:

              【解决方案13】:
              $email = User::find($request->email);
              If($email->count()>0)
              <h1>Email exist, please make new email address</h1>
              endif
              

              【讨论】:

                【解决方案14】:
                $user = User::where('email', request('email')->first();
                return (count($user) > 0 ? 'Email Exist' : 'Email Not Exist');
                

                【讨论】:

                  【解决方案15】:

                  这将检查表中是否存在特定的电子邮件地址:

                  if (isset(User::where('email', Input::get('email'))->value('email')))
                  {
                      // Input::get('email') exist in the table 
                  }
                  

                  【讨论】:

                    【解决方案16】:

                    最短的工作选项:

                    // if you need to do something with the user 
                    if ($user = User::whereEmail(Input::get('email'))->first()) {
                    
                        // ...
                    
                    }
                    
                    // otherwise
                    $userExists = User::whereEmail(Input::get('email'))->exists();
                    

                    【讨论】:

                      【解决方案17】:
                      $user = User::where('email', '=', Input::get('email'))->first();
                      if ($user === null) {
                         // user doesn't exist
                      }
                      

                      可以写成

                      if (User::where('email', '=', Input::get('email'))->first() === null) {
                         // user doesn't exist
                      }
                      

                      如果您在原始语句中只使用 $user ,这将返回 true 或 false 而不分配临时变量。

                      【讨论】:

                        【解决方案18】:

                        我认为以下方法是实现相同目标的最简单方法:

                            $user = User::where('email', '=', $request->input('email'))->first();
                            if ($user) {
                               // user doesn't exist!
                            }
                        

                        【讨论】:

                          【解决方案19】:

                          创建以下方法(为我自己)以检查给定的记录 id 是否存在于 Db 表中。

                          private function isModelRecordExist($model, $recordId)
                          {
                              if (!$recordId) return false;
                          
                              $count = $model->where(['id' => $recordId])->count();
                          
                              return $count ? true : false;
                          }
                          
                          // To Test
                          $recordId = 5;
                          $status = $this->isModelRecordExist( (new MyTestModel()), $recordId);
                          

                          首页 有帮助!

                          【讨论】:

                          • 请注意,通过使用count,您正在计算整个表中的某条记录。而 exists 方法返回 true 如果表包含至少一个所需的记录。
                          【解决方案20】:

                          最简单的方法

                              public function update(Request $request, $id)
                          {
                          
                          
                              $coupon = Coupon::where('name','=',$request->name)->first(); 
                          
                              if($coupon->id != $id){
                                  $validatedData = $request->validate([
                                      'discount' => 'required',   
                                      'name' => 'required|unique:coupons|max:255',      
                                  ]);
                              }
                          
                          
                              $requestData = $request->all();
                              $coupon = Coupon::findOrFail($id);
                              $coupon->update($requestData);
                              return redirect('admin/coupons')->with('flash_message', 'Coupon updated!');
                          }
                          

                          【讨论】:

                            【解决方案21】:

                            Laravel 6 or on top:写下表名,然后给出where子句条件例如where('id', $request->id)

                             public function store(Request $request)
                                {
                            
                                    $target = DB:: table('categories')
                                            ->where('title', $request->name)
                                            ->get()->first();
                                    if ($target === null) { // do what ever you need to do
                                        $cat = new Category();
                                        $cat->title = $request->input('name');
                                        $cat->parent_id = $request->input('parent_id');
                                        $cat->user_id=auth()->user()->id;
                                        $cat->save();
                                        return redirect(route('cats.app'))->with('success', 'App created successfully.');
                            
                                    }else{ // match found 
                                        return redirect(route('cats.app'))->with('error', 'App already exists.');
                                    }
                            
                                }
                            

                            【讨论】:

                              【解决方案22】:

                              Validator

                              简单、舒适且易于理解
                              class CustomerController extends Controller
                              {
                                  public function register(Request $request)
                                  {
                              
                                      $validator = Validator::make($request->all(), [
                                          'name' => 'required|string|max:255',
                                          'email' => 'required|string|email|max:255|unique:customers',
                                          'phone' => 'required|string|max:255|unique:customers',
                                          'password' => 'required|string|min:6|confirmed',
                                      ]);
                              
                                      if ($validator->fails()) {
                                          return response(['errors' => $validator->errors()->all()], 422);
                                      }
                              

                              【讨论】:

                                【解决方案23】:

                                如果您想在数据库中插入一条记录,但不存在具有相同电子邮件的记录,那么您可以执行以下操作:

                                $user = User::updateOrCreate(
                                    ['email' => Input::get('email')],
                                    ['first_name' => 'Test', 'last_name' => 'Test']
                                );
                                

                                updateOrCreate 方法的第一个参数列出了在关联表中唯一标识记录的列,而第二个参数包含要插入或更新的值。

                                您可以在此处查看文档:Laravel upserts doc

                                【讨论】:

                                  【解决方案24】:

                                  如果要插入唯一记录,可以使用 laravel 验证:

                                  $validated = $request->validate([
                                      'title' => 'required|unique:usersTable,emailAddress|max:255',
                                  ]);
                                  

                                  但你也可以使用这些方式:

                                  1:

                                  if (User::where('email',  $request->email)->exists())
                                  {
                                    // object exists
                                  } else {
                                    // object not found
                                  }
                                  

                                  2:

                                  $user = User::where('email',  $request->email)->first();
                                  
                                  if ($user)
                                  {
                                    // object exists
                                  } else {
                                    // object not found
                                  }
                                  

                                  3:

                                  $user = User::where('email',  $request->email)->first();
                                  
                                  if ($user->isNotEmpty())
                                  {
                                    // object exists
                                  } else {
                                    // object not found
                                  }
                                  

                                  4:

                                  $user = User::where('email',  $request->email)->firstOrCreate([
                                        'email' => 'email'
                                  ],$request->all());
                                  

                                  【讨论】:

                                  • 请考虑 count 方法计算记录,在这种情况下性能不佳。
                                  • @AliN11 我没有使用count方法
                                  【解决方案25】:
                                  $userCnt     = User::where("id",1)->count();
                                  if( $userCnt ==0 ){
                                       //////////record not exists 
                                  }else{
                                        //////////record exists 
                                  }
                                  

                                  注意 :: 根据您的要求提供条件。

                                  【讨论】:

                                    【解决方案26】:

                                    您已经看到了很多解决方案,但神奇的检查语法可能是这样的,

                                    $model = App\Flight::findOrFail(1);
                                    
                                    $model = App\Flight::where('legs', '>', 100)->firstOrFail();
                                    

                                    当未找到任何相关模型时,它会自动引发异常并响应 404 有时您可能希望在未找到模型时引发异常。这在路由或控制器中特别有用。 fingernail 和 firstOrFail 方法将检索查询的第一个结果;但是,如果没有找到结果,则会抛出 Illuminate\Database\Eloquent\ModelNotFoundException

                                    参考:https://laravel.com/docs/5.8/eloquent#retrieving-single-models

                                    【讨论】:

                                      【解决方案27】:

                                      【讨论】:

                                      【解决方案28】:

                                      检查记录是否存在的有效方法必须使用 is_null 方法来检查查询。

                                      下面的代码可能会有所帮助:

                                      $user = User::where('email', '=', Input::get('email'));
                                      if(is_null($user)){
                                       //user does not exist...
                                      }else{
                                       //user exists...
                                      }
                                      

                                      【讨论】:

                                        【解决方案29】:

                                        知道有没有记录很简单

                                        $user = User::where('email', '=', Input::get('email'))->get();
                                        if(count($user) > 0)
                                        {
                                        echo "There is data";
                                        }
                                        else
                                        echo "No data";
                                        

                                        【讨论】:

                                        • 获取所有记录,然后计数?!
                                        【解决方案30】:

                                        这是检查电子邮件是否存在于数据库中的简单代码

                                        $data = $request->all(); $user = DB::table('User')->pluck('email')->toArray(); if(in_array($user,$data['email'])) { echo '现有电子邮件'; }

                                        【讨论】:

                                        • 如果你有一个表用户......说超过 1,000,000,000 条记录,你会检查很长时间
                                        猜你喜欢
                                        • 2021-08-08
                                        • 2020-01-14
                                        • 2018-06-01
                                        • 2011-02-20
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多