2017-01-18 1 views
2

У меня есть несколько черных моделей с отношениями друг с другом, но я хочу, чтобы эти отношения устанавливались только в том случае, если существуют соответствующие данные.Laravel Eloquent: установить отношения только в том случае, если существуют связанные данные

Например:

  • отдел (модель) -> hasMany -> Рабочий (модель) (связь должна быть устанавливается, только если отдел связанные работников, в противном случае не установлена)

Возможно ли это? Я попытался это и не horrably: (подразделении модели)

public function worker() { 

    $model = new Department(); 

    if(isset($model->relations)) { 
     return $this->hasMany(Worker::class, 'wrk_department_id'); 
     } 
    } 

// EDIT:

Когда отдел не имеет рабочих мой выход, как:

{ 
"data": { 
    "type": "department", 
    "id": "8", 
    "attributes": { 
     "accessory": [], 
     "department": "Marketing", 
     "department_id": 8, 
     "dept_floor_id": 2, 
     "inventory": [], 
     "software": [], 
     "worker": [] 
    }, 
    "links": { 
     "self": { 
      "href": "http://127.0.0.1:8000/api/v2/department/8" 
     } 
    } 
}, 
"links": { 
    "self": { 
     "href": "http://127.0.0.1:8000/api/v2/department/8" 
    } 
}, 
"jsonapi": { 
    "version": "1.0" 
} 

}

Когда отдел работает, все работает как ожидалось:

{ 
"data": { 
"type": "department", 
"id": "1", 
"attributes": { 
    "department": "Entwicklung", 
    "department_id": 1, 
    "dept_floor_id": 3 
}, 
"links": { 
    "self": { 
    "href": "http://127.0.0.1:8000/api/v2/department/1" 
    } 
}, 
"relationships": { 
    "worker": { 
    "data": [ 
     { 
     "type": "worker", 
     "id": "5" 
     }, 
     { 
     "type": "worker", 
     "id": "8" 
     }, 
     { 
     "type": "worker", 
     "id": "11" 
     }, 
     { 
     "type": "worker", 
     "id": "13" 
     }, //and so on 

Я пытаюсь избавиться от пустых массивов (например: «рабочий»: []), которые появляются, когда их нет связанных данных.

+0

Что вы пытаетесь достичь? Получить только отделы с рабочими в нем или что-то еще? –

+0

Редактировал сообщение –

+0

Ваш результат управляется запросом, который вы используете. Не то, что вы определяете в своей «модели». – Gayan

ответ

1

В Department моделью добавить отношения.

public function worker() { 
    return $this->hasMany(Worker::class, 'wrk_department_id'); 
} 

И когда вы запрашиваете внутри вас method в your-controller.

$builder = Department::with('other-relationships'); 
If('your-condition-check') { 
    $builder-with('workers'); 
} 
$model = $builder->get(); 

Это концепция. Используйте соответствующий код для своего сценария.

+0

Спасибо за ваш ответ! Это работает :) –

+0

Рад, что вы найдете это полезным. Цените, если вы могли бы отметить его как принято и до голосования :) – Gayan

+0

Я отметил его как принято. но, к сожалению, я не могу повышать из-за отсутствия точек репутации, извините :( –

0

Просто добавьте отношения и отфильтруйте их только для тех, в том числе:

$departments = Department::with('workers')->filter(function($department) { 
     return ! is_null($department->workers) 
    }); 

Таким образом, у вас есть только отделы, в которых есть хотя бы один рабочий.

+0

Спасибо! Работает отлично, точно так же, как решение, предоставленное Гайаном –

Смежные вопросы