当调用CollegeMajor::with('majors')->get()
时,我想应用以下原始sql查询:
TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM Parent_id)
到 parent_id
列。 Parent_id 中的值存储为 1:1234, 1:3121, 1:1332
等...因此我想删除冒号后的所有内容。 CollegeMajor 的主键是 id,这些值是像 1
这样的整数。我收到以下错误,因为 Laravel 认为原始查询是列的名称。在执行关系时,如何告诉 Laravel 将 sql 查询应用于 project_id
列?
CollegeMajor.php
class CollegeMajor extends Model {
public function majors() {
return $this->hasMany('App\Models\CollegeMajor', \DB::raw(TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id)))
->where('entity', 'major');
}
}
错误
Unknown column 'college_major.TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id)' in 'where clause' (SQL: select * from `college_major` where `entity` = major and `college_major`.`TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id)` in (1, 2, 3, 4, 5, 6, 7, 8))
学院专业表
id name entity parent_id
1 College of Art college 1234
2 College of Business college 4567
3 Art History major 1:1234
4 Asian Art major 1:1234
5 Accounting major 2:4567
6 Marketing major 2:4567
如何让它返回?
[
id: 1,
name: 'College of Art',
entity: 'college',
parent_id: 1234,
majors: [
{
id: 3,
name: 'Art History',
entity: 'major',
parent_id: '1:1234'
},
{
id: 4,
name: 'Asian Art',
entity: 'major',
parent_id: '1:1234'
}
]
....
]
最佳答案
hasMany() 的第二个参数是外键。所以你不能在那里定义你的查询。按如下方式定义你们的关系。
public function majors() {
return $this->hasMany('App\Models\CollegeMajor');
}
然后当您查询时使用 raw expressions这个。
CollegeMajor::with('majors')
->select(DB::raw('TRIM(TRAILING SUBSTRING_INDEX(parent_id, ":", -1) FROM parent_id))')
->where('entity', 'major')->get();
尚未测试。在我的手机上:)
关于php - Laravel 5.2 定义自引用模型关系时使用原始查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41928425/