2017-01-30 52 views
0

當調用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列?Laravel 5.2定義自引用模型關係時使用原始查詢?

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)) 

college_majors表

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' 
    } 

    ] 
    .... 
] 

回答

0

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(); 

尚未測試。在我的手機:)

+0

非常接近我認爲。我編輯了我的問題。該集合是我想要實現的。有什麼建議麼? –

+0

我更新了答案,因爲我忘記在查詢結尾處添加'get()'。然後它會返回一個集合。 – Gayan

+0

我不得不做一些黑客解決方案,我從表格中獲得所有結果,只按大學過濾結果,爲每個大學對象添加「專業」鍵,然後遍歷每條記錄,如果它是主要的,則我遍歷每個大學的對象,並把這門專業推到它所屬的大學。迄今爲止,一個優雅的解決方案,但我認爲它現在會做。 –