【问题标题】:Laravel Inner Join?Laravel 内部连接?
【发布时间】:2017-01-12 19:34:29
【问题描述】:

我有一个 PHP 后端,我目前正在改用 Laravel 框架。但是,我不太确定 Laravel 内连接是如何工作的。

我试图转移到 Laravel 的 SQL 查询是:

"SELECT leagues.league_name FROM leagues INNER JOIN countries on leagues.country_id = countries.country_id WHERE countries.country_name = '$country' "

有人能解释一下 Laravel Joins 是如何工作的吗?

抱歉,如果这个问题不合适。

【问题讨论】:

标签: php laravel


【解决方案1】:

应该是这样的(未测试):

$leagues = DB::table('leagues')
    ->select('league_name')
    ->join('countries', 'countries.country_id', '=', 'leagues.country_id')
    ->where('countries.country_name', $country)
    ->get();

$leagues 将是 Illuminate\Support\Collection 对象的实例,因此您可以使用 foreach 对其进行迭代。

您可以将第 5 个参数传递给 join() 函数,该函数将指定连接类型(默认为“内部”)。

如果您使用 Eloquent 并拥有“联盟”模型,那么您也可以在模型上使用 join:

$leagues = League::select('league_name')
    ->join('countries', 'countries.country_id', '=', 'leagues.country_id')
    ->where('countries.country_name', $country)
    ->get();

在这种情况下,$leagues 将是 Illuminate\Database\Eloquent\Collection 的一个实例,它扩展了常规 Laravel 集合并为您提供比常规集合更多的功能。

但是,还有一种更简单的方法可以在不使用连接的情况下编写此代码:

$leagues = League::select('league_name')->whereHas('countries', function($query) use ($country) {
    $query->where('country_name', $country);
})->get();

请注意,在此示例中,“国家/地区”不是表名,而是 Eloquent relationship name,因此您需要在使用此方法之前设置您的关系。

另外,这个例子不是使用join,而是使用两个查询,或者一个嵌套查询,我不确定;但是是这样的:SELECT league_name FROM leagues WHERE country_id IN (SELECT id FROM countries WHERE country_name='$country')

【讨论】:

    【解决方案2】:

    这很简单,也许只是使用查询构建器查看您的查询会更有意义。

    $results = DB::table('leagues')
        ->join('countries', 'leagues.country_id', '=', 'countries.country_id')
        ->where('countries.country_name', $country)
        ->get();
    

    【讨论】:

    • 你这里有一个错误,表(在join语句中)不是“leads”而是“leagues”:)
    【解决方案3】:

    在 Laravel Eloquent 中,你可以以非常聪明的方式完成这一切。

    parent_table_model::with('relational_table_model')->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 2021-05-15
      • 2021-04-29
      • 1970-01-01
      • 2019-02-25
      • 2016-11-16
      • 2016-08-27
      • 2017-06-06
      相关资源
      最近更新 更多