【问题标题】:Join Tables not working unless hard code ID除非硬编码 ID,否则联接表不起作用
【发布时间】:2021-12-08 16:58:49
【问题描述】:

我忘记了我已经通过了 $weekends id 所以我做了这个公共函数

show(Weekend $weekend) 
    {
        $id = $weekend->id; 
        $teams = DB::table('weekends')
        ->join('weekend_team_members', 'weekend_team_members.weekends_id', '=', 'weekends.id')
        ->select('weekend_team_members.firstname','weekend_team_members.lastname','weekend_team_members.position')
        ->where('weekend_team_members.weekends_id', $id)
        ->get();

        return view('pages.weekend')->with(['weekend' => $weekend,'teams'=> $teams]);
    }

此代码仅在我将 ->where('weekend_team_members.weekends_id', '=','weekends.id') 更改为 ->where('weekend_team_members.weekends_id', '=',2) 否则它是一个空数组。我敢肯定它可能很简单,但我想不通。

这是我的加入声明

 $teams = DB::table('weekends')
    ->join('weekend_team_members', 'weekend_team_members.weekends_id', '=', 'weekends.id')
    ->select('weekend_team_members.firstname','weekend_team_members.lastname','weekend_team_members.position')
    ->where('weekend_team_members.weekends_id', '=','weekends.id')
    ->get();

周末模特

   <?php

namespace App\Models\Webmaster;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Weekend extends Model
{
    use HasFactory;
    
    protected $fillable = ['title','verse','songtitle','songvideo','image'];

    public function weekendTeamMembers() {
        return $this->hasMany(App\Models\Webmaster\WeekendTeamMember::class);
    }

 

}

周末团队成员模型

<?php

namespace App\Models\Webmaster;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class WeekendTeamMember extends Model
{
    use HasFactory;
    protected $fillable = ['firstname','lastname','position'];

    public function weekend() {
        return $this->belongsTo(App\Models\Webmaster\Weekend::class);
    }
}

【问题讨论】:

    标签: laravel join


    【解决方案1】:

    您正在寻找whereColumn() 方法:https://laravel.com/docs/8.x/queries#additional-where-clauses(向下滚动一点)。现在,您正在搜索文字字符串 weekends.id

    SELECT * FROM `weekends` JOIN ... WHERE `weekend_team_members`.`weekends_id` = 'weekends.id'
    

    whereColumn() 将确保您执行正确的 SQL:

    SELECT * FROM `weekends` JOIN ... WHERE `weekend_team_members`.`weekends_id` = `weekends`.`id`
    

    注意使用单引号和反引号的区别:

    = 'weekends.id'
    = `weekends`.`id`
    

    一个是字符串,一个是DB列,会产生不同的结果。

    因此,您的最终查询将是:

    $teams = DB::table('weekends')
    ->join('weekend_team_members', 'weekend_team_members.weekends_id', '=', 'weekends.id')
    ->select('weekend_team_members.firstname','weekend_team_members.lastname','weekend_team_members.position')
    ->whereColumn('weekend_team_members.weekends_id', 'weekends.id')
    ->get();
    

    (注意:= 是隐含的,它是可选的,但-&gt;whereColumn('weekend_team_members.weekends_id', '=', 'weekends.id') 也是有效的)

    【讨论】:

    • OK 这可行,但会选择所有周末。我正在寻找列出所有周末团队的周末团队成员.weekends_id = 到周末.id。例如,如果周末.id 为 1,并且有 4 个周末团队成员.周末 ID 为 4,则它应该只列出这 4 个
    • 是的,另一个答案有点强调为什么会发生这种情况。如果你从不传递某种 ID,你就会得到一切,因为你的 join()whereColumn() 子句基本上做同样的事情。此答案只是突出显示尝试与列进行比较时要使用的正确语法。
    • 我看到了那个答案,但不知道如何解决它。
    • 重新考虑您的方法。尝试找出在某种 SQL 编辑器中有效的查询,然后尝试将其转换为 Laravel 的查询构建器。核心问题不限于某种weekends.id 值,所以你得到了一切。
    • 请不要在 cmets 中发布。使用新信息编辑您的问题;它的格式不如评论。
    【解决方案2】:

    首先,如果不定义列,weekend_team_members.weekends_id 将无法在本地工作。 Laravel 期望它是周末 ID(单数)。

    其次,您的 where() 子句不接受列名作为参数,即使接受了,它也不会做任何事情。您所描述的“位置”已经由您的 ->join() 方法完成(这就是内部连接)。

    第三,join的目的到底是什么?您只是从weekend_team_members 表中选择列。

    如果打算过滤掉没有weekend_id 的weekend_team_members,那么您只需要执行->whereNotNull('weekend_id')。如果您想从周末表中选择一些列,您已经可以从您创建的联接中执行此操作。

    如果您正在寻找属于某个特定周末的团队成员,那么您需要向其传递一个 ID(否则查询如何知道您要寻找哪个周末?)。

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2021-05-19
      • 1970-01-01
      • 2014-01-19
      • 2012-12-25
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多