【问题标题】:Laravel where in query [duplicate]Laravel在哪里查询[重复]
【发布时间】:2015-07-29 10:39:38
【问题描述】:

我将如何使用 Laravel 做到这一点?

SELECT movie.title
FROM movie
WHERE movie.id IN
(SELECT session.movie_id FROM session WHERE session.id = :id and date = :date)

【问题讨论】:

标签: laravel


【解决方案1】:

使用 DB::raw 运行原始查询

$query = DB::select(DB::raw("选择电影.title 从电影 movie.id 在哪里 (select session.movi​​e_id from session where session.id = $id and date = $date);"));

返回$查询;

【讨论】:

    【解决方案2】:

    你可以使用laravel的advanced-wheres

    $movie = Movie::whereIn('id', function($query) use ($id, $date) {
        $query->select(DB::raw('session.movie_id'))
              ->from('session')
              ->whereRaw('session.id = ? and session.date = ? array($id, $date));
    
    })
    ->get();
    

    【讨论】:

      【解决方案3】:

      首先,您需要一个包含电影和会话表的数据库以及 Laravel 中的两个模型。

      电影模型

          <?php namespace App;
      
          use Illuminate\Database\Eloquent\Model;
      
          class Movie extends Model {
      
            protected $fillable = ['title'];
      
            public function sessions()
            {
                return $this->hasMany('App\Session');
            }
            }
          ?>
      

      会话模型

          <?php namespace App;
      
          use Illuminate\Database\Eloquent\Model;
      
          class Session extends Model {
      
            public function movies()
            {
                return $this->belongsTo('App\Movie','movie_id');
            }
          ?>
      

      您的控制器中的查询将具有类似的方法。

      public function show($id)
      {
          try {
              $movie = Movie::with('sessions')->where('id',$id)->firstOrFail();
          }
          catch(ModelNotFoundException $exception)
          {
              abort(404);
          }
          return view('movies.show')->withMovie($movie);
      }
      

      【讨论】:

        【解决方案4】:

        无论您使用 laravel ORM,它都会生成多个查询,我建议您先在会话表中查询并获取列表,然后在电影模型中的 where 查询中使用该结果。

        【讨论】:

          【解决方案5】:

          $query = "select movie.title from movie where movie.id IN (SELECT session.movi​​e_id FROM session WHERE session.id ='".$id."' and date = '".$date."') ;

          $resultSet = DB::select($query);

          希望这会有所帮助。

          【讨论】:

            【解决方案6】:

            使用左连接。 例如,

            $first = DB::session('movie.title')->leftjoin('session','session.movi​​e_id','=','movie.id')->where('session.id' , '=', $id)->where('session.date','=','$date')->get();

            要检查结果,

            dd(第一);

            希望这会有所帮助。

            【讨论】:

              【解决方案7】:
              $query = "SELECT movie.title
                  FROM movie
                  WHERE movie.id IN
                  (SELECT session.movie_id FROM session WHERE session.id = ? and date = ?)";
              
              $movie = \DB::select($query, [$id, $date]);
              

              【讨论】:

                【解决方案8】:

                使用 LEFT JOIN 是优化代码的好选择。否则请查看以下说明。

                以下代码行将生成获取电影 ID 的查询。使用“toSql()”方法将返回查询而不是结果。

                $movie_id_qry = DB::table('session')->select('session.movie_id')->whereRaw('session.id = '. $id .' && date = '. $date)->toSql();
                

                同样可以包含这个查询来获取电影标题:

                $movie_title = DB::table('movies')->where('movie.id', '=', $movie_id_qry)->pluck('movie.title');
                

                结果:echo $movie_title;

                如果找到匹配,“pluck()”方法将只返回标题列。 要检索整行,请使用“get()”方法而不是“pluck()”。

                由于“toSql()”方法只会生成查询,组合的数据库提取只发生在第二行代码中。

                希望这有帮助。

                【讨论】:

                  【解决方案9】:
                  DB::table('movies')
                    ->select(
                      movies.title, 
                      DB::raw(
                        '(select session.movie_id from session where session.id = id AND date = date') as movie_id'
                      )
                    )->where('movies.id','movie_id')get();
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-07-30
                    • 2019-04-27
                    • 2018-03-31
                    • 1970-01-01
                    • 2017-04-17
                    • 1970-01-01
                    • 2018-09-08
                    • 2013-08-21
                    相关资源
                    最近更新 更多