Php 未找到laravel联接表列

Php 未找到laravel联接表列,php,laravel,join,eloquent,Php,Laravel,Join,Eloquent,嗨,我正在构建一个应用程序,我有一个表,用于示例项目和设置。但是,它们彼此之间没有外键,我有其他表,如任务、客户端等,这些表有我计划保存在设置表中的设置 设置表有一列类型,我将用相关型号名称填充该列,例如project。无论如何,当我获取一个项目时,我还想获取一个设置,其中type=project。因此,我尝试执行表联接,但这引发了以下错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'project' in 'on claus

嗨,我正在构建一个应用程序,我有一个表,用于示例项目和设置。但是,它们彼此之间没有外键,我有其他表,如任务、客户端等,这些表有我计划保存在设置表中的设置

设置表有一列类型,我将用相关型号名称填充该列,例如
project
。无论如何,当我获取一个项目时,我还想获取一个设置,其中type=project。因此,我尝试执行表联接,但这引发了以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'project' in 'on clause' (SQL: select * from `projects` inner join `settings` on `type` = `project`)
我使用的代码如下:

return \Project::()->join('settings', 'type', '=', 'project')->get();     
我明白问题是什么了,它正在寻找一个名为project的专栏,但是没有。我想我要做的是使用eloquent和一个查询函数连接表,然后查询设置表,其中type=project。有人知道我怎么做吗

从burak答案更新 我试着把这个放在我的模型里

settings.php

public function sprint() { 
return \Setting::where('type', '=', 'sprint')->get(); 
} 
和sprint.php

public function settings() {
 return \Setting::where('type', '=', 'sprint')->get(); 
} 
然而,我得到了对undefined方法的这个错误调用

Illumb\Database\Eloquent\Collection::AddagerConstraints()我使用以下方法调用它:

return Sprint::with(['settings'])->get(); 

我做错了什么

因为您没有引用表名,而是在比较列。相反,您需要的是连接条件中的
where
语句,以便与值进行比较

return DB::table('projects')
    ->join('settings', function ($join) {
        $join->where('settings.type', '=', 'project');
    })->get();     
但是您最好一个接一个地获取设置和项目,因为所有相同的设置列都将添加到您的项目行中,这是不好的

$data = [];
$data['projects'] = Project::all();
$data['settings'] = Settings::where('type', '=', 'project')->first();
return $data;
更新:

在您的Sprint模型中

public function scopeWithType()
{
    return static::join('settings', function ($join) {
        $join->where('settings.type', '=', 'sprint');
    });
}
然后在控制器内

Sprint::withType()->get();

因为您不是在引用表名,而是在比较列。相反,您需要的是连接条件中的
where
语句,以便与值进行比较

return DB::table('projects')
    ->join('settings', function ($join) {
        $join->where('settings.type', '=', 'project');
    })->get();     
但是您最好一个接一个地获取设置和项目,因为所有相同的设置列都将添加到您的项目行中,这是不好的

$data = [];
$data['projects'] = Project::all();
$data['settings'] = Settings::where('type', '=', 'project')->first();
return $data;
更新:

在您的Sprint模型中

public function scopeWithType()
{
    return static::join('settings', function ($join) {
        $join->where('settings.type', '=', 'sprint');
    });
}
然后在控制器内

Sprint::withType()->get();

我没有试过,但我想这是你想要的。这就是我们使用where子句进行子查询或查询联接的方式

return \Project::join('settings', function($q) {
    $q->where('type', '=', 'project');
})->get();

您的代码在表
settings
中查找与
project
字段相匹配的记录,在
project
表中查找与
type
字段相匹配的记录,但事实并非如此。

我没有尝试过,但我认为这正是您想要的。这就是我们使用where子句进行子查询或查询联接的方式

return \Project::join('settings', function($q) {
    $q->where('type', '=', 'project');
})->get();

您的代码在表
settings
中查找与
project
字段相匹配的记录,在
project
表中查找与
type
字段相匹配的记录,但事实并非如此。

ahh很酷,谢谢我尝试将其与so settings.php公共函数sprint()一样放入我的模型中({return\Setting::where('type','=','sprint'))->get();}和sprint.php公共函数settings(){return\Setting::where('type','=','sprint')->get();}但是我对未定义的方法illumb\Database\elount\Collection::addagerConstraints()进行了这个错误调用,我使用这个方法调用它:return sprint::with(['settings'])->get();我做错了什么?啊,太酷了,谢谢。我已经试着把它和so settings.php公共函数sprint(){return\Setting::where('type','=','sprint')->get();}和sprint.php公共函数settings(){return\Setting::where('type','=','sprint')->get();}但是,我得到了对undefined方法illumb\Database\Eloquent\Collection::AddagerConstraints()的错误调用,我使用这个方法调用了它:return Sprint::with(['settings')->get();我做错了什么?语法错误、意外的“(”、预期的标识符(T_字符串)或变量(T_变量)或“{”或“$”从return语句中删除
->get()
,以消除错误。在调用
sprint()
settings()时将其放在后面
以消除错误。让我稍后编辑我的答案。语法错误、意外的“(”、预期的标识符(T_字符串)或变量(T_变量)或“{”或“$”从return语句中删除
->get()
以消除错误。在调用
sprint()
settings()时将其放在后面
以消除错误。让我马上编辑我的答案。