您好我正在构建一个应用程序,我有一个表格,例如项目和设置。然而,他们没有彼此的外键,我有其他表,如任务,客户等。这些设置我打算保存在设置表中。
设置表有一个类型列,我将填写相关的型号名称,例如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。有谁知道我怎么做到这一点?
我试图把它放在我的模型中,所以
的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();
我在这里做错了什么?
答案 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
表中的settings
和type
字段中查找与project
字段匹配的记录,但情况并非如此。