temas - php laravel templates
Laravel 4.1 carga ansiosa (2)
Estoy teniendo problemas con la carga ansiosa. Digamos que tengo modelos de Miembros, Categoría de Entrenamiento, Informe de Categoría de Entrenamiento y Registro
Modelo de miembro:
public function registration() {
return $this->hasMany(''Registration'', ''member_id'');
}
public function trainingResults(){
return $this->hasMany(''trainingResult'', ''member_id'');
}
public function trainingCategoryResults() {
return $this->hasMany(''TrainingCategoryResult'', ''member_id'');
}
Modelo de formación de categoría:
public function trainings() {
return $this->hasMany(''Training'', ''id'');
}
public function trainingCategoryResults() {
return $this->hasMany(''trainingCategoryResult'', ''category_id'');
}
TraningCategoryResult Model:
public function category() {
return $this->belongsTo(''TrainingCategory'', ''id'');
}
public function member() {
return $this->belongsTo(''Member'', ''id'');
}
Modelo de registro:
public function course() {
return $this->belongsTo(''Course'', ''course_id'');
}
public function member() {
return $this->belongsTo(''Member'', ''id'');
}
Estoy tratando de cargar toda la información de registro y su información relacionada, incluida la información de TraningCategoryResult pero no estoy seguro de cómo obtener ese TraningCategoryResult que requiere dos claves foráneas (category_id y member_id), ¿hay alguna manera de hacerlo?
Aquí está mi código atm:
$members= Member::where(function($query) use ($id, $site) {
$query
->where(''id'', ''='', $id)
->where(''site'', ''='', $site);
});
$members= $members
->with(''registration.course'',
''registration.course.traningCategories'',
->get([''member.id'']);
Gracias.
Esto no funcionará Member :: with (''categoryResult'') -> with (''registration'') -> get ()
Puede hacer una nueva relación en el Modelo de miembro
public function categoryResult()
{
return $this->belongsTo(''Category'')->with(''Registration'');
}
// y luego llamar
Member :: with (''categoryResult'') -> get ();
Puede usar algunas opciones para lograr eso:
OPCIÓN 1 : crea una relación variable
Cambie su relación en el modelo de miembro
public function trainingCategoryResults($category_id = null) {
if(empty($category_id))
return $this->hasMany(''TrainingCategoryResult'', ''member_id'');
else
return $this->hasMany(''TrainingCategoryResult'', ''member_id'')
->where(''category_id'', $category_id);
}
El código anterior puede tener limitaciones y no aprovecha muchas características de laravel, pero funcionará.
OPCIÓN 2: Acceso desde la relación
Puede mantener todo tal como está y cargar de la siguiente manera:
$members= Member::where(function($query) use ($id, $site) {
$query
->where(''id'', ''='', $id)
->where(''site'', ''='', $site);
})
->where(''id'', $member_id) // set the id of the memeber
->with(array(
''traningCategoryResults'' => function($q)use($category_id){
$q->where(''category_id'', $category_id); // This makes sure you get only desired results
}
))
De esta forma, solo tendrás lo que necesitas, suponiendo que conozcas el $ category_id