with hasone hasmany example español delete belongsto laravel laravel-4 eloquent

laravel - hasone - ¿Cómo acceder a la relación hasMany modelo con la condición?



laravel hasmany example (6)

¿Has creado un modelo para "Role"? Compruebe si el problema existe incluso después de crear el modelo para el rol.

Creé un juego modelo usando una condición / restricción para una relación de la siguiente manera:

class Game extends Eloquent { // many more stuff here // relation without any constraints ...works fine public function videos() { return $this->hasMany(''Video''); } // results in a "problem", se examples below public function available_videos() { return $this->hasMany(''Video'')->where(''available'',''='', 1); } }

Cuando se usa de alguna manera como esta:

$game = Game::with(''available_videos'')->find(1); $game->available_videos->count();

Todo funciona bien, ya que los roles son la colección resultante.

MI PROBLEMA:

Cuando intento acceder a él sin carga ansiosa

$game = Game::find(1); $game->available_videos->count();

se lanza una excepción cuando dice " Llamar a un recuento de funciones miembro () en un no objeto ".

Utilizando

$game = Game::find(1); $game->load(''available_videos''); $game->available_videos->count();

funciona bien, pero me parece bastante complicado, ya que no necesito cargar modelos relacionados, si no uso las condiciones dentro de mi relación.

¿Me he perdido algo? ¿Cómo puedo asegurarme de que se puede acceder a available_videos sin utilizar una carga impaciente?

Para cualquier persona interesada, también he publicado este problema en http://forums.laravel.io/viewtopic.php?id=10470


// baja para v4 alguna versión

public function videos() { $instance =$this->hasMany(''Video''); $instance->getQuery()->where(''available'',''='', 1); return $instance }

// v5

public function videos() { $instance =$this->hasMany(''Video''); $instance->where(''available'',''='', 1); return $instance }


Creo que esta es la forma correcta:

class Game extends Eloquent { // many more stuff here // relation without any constraints ...works fine public function videos() { return $this->hasMany(''Video''); } // results in a "problem", se examples below public function available_videos() { return $this->videos()->where(''available'',''='', 1); } }

Y entonces tendrás que

$game = Game::find(1); var_dump( $game->available_videos()->get() );



En caso de que alguien más encuentre los mismos problemas.

Tenga en cuenta, que las relaciones deben ser camelcase. Entonces, en mi caso, available_videos () debería haber sido disponibleVideos ().

Puede encontrar fácilmente investigando la fuente de Laravel:

// Illuminate/Database/Eloquent/Model.php ... /** * Get an attribute from the model. * * @param string $key * @return mixed */ public function getAttribute($key) { $inAttributes = array_key_exists($key, $this->attributes); // If the key references an attribute, we can just go ahead and return the // plain attribute value from the model. This allows every attribute to // be dynamically accessed through the _get method without accessors. if ($inAttributes || $this->hasGetMutator($key)) { return $this->getAttributeValue($key); } // If the key already exists in the relationships array, it just means the // relationship has already been loaded, so we''ll just return it out of // here because there is no need to query within the relations twice. if (array_key_exists($key, $this->relations)) { return $this->relations[$key]; } // If the "attribute" exists as a method on the model, we will just assume // it is a relationship and will load and return results from the query // and hydrate the relationship''s value on the "relationships" array. $camelKey = camel_case($key); if (method_exists($this, $camelKey)) { return $this->getRelationshipFromMethod($key, $camelKey); } }

Esto también explica por qué mi código funcionó, siempre que cargué los datos utilizando el método load () antes.

De todos modos, mi ejemplo funciona perfectamente bien ahora, y $ model-> availableVideos siempre devuelve una Colección.


Si desea aplicar la condición en la tabla relacional, puede utilizar otras soluciones también. Esta solución funciona desde mi punto de vista.

public static function getAllAvailableVideos() { $result = self::with([''videos'' => function($q) { $q->select(''id'', ''name''); $q->where(''available'', ''='', 1); }]) ->get(); return $result; }