未找到laravel连接表列

时间:2015-06-27 23:22:23

标签: php laravel join eloquent

您好我正在构建一个应用程序,我有一个表格,例如项目和设置。然而,他们没有彼此的外键,我有其他表,如任务,客户等。这些设置我打算保存在设置表中。

设置表有一个类型列,我将填写相关的型号名称,例如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(); 
} 

然而我收到此错误调用未定义的方法

Illuminate \ Database \ Eloquent \ Collection :: addEagerConstraints()我用这个方法调用它:

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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

因为您没有引用表名并且正在比较列。相反,您需要在连接条件中使用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();

答案 1 :(得分:1)

我没试过,但我认为这就是你想要的。这就是我们如何使用where子句进行子查询或查询连接。

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

您的代码会在project表中的settingstype字段中查找与project字段匹配的记录,但情况并非如此。