obtener el valor de una columna de tabla dinámica adicional laravel


Tengo una tabla dinámica phone_models, phone_problems y phone_model_phone_problem. La tabla dinámica tiene una columna extra 'precio'.

PhoneModel:

class PhoneModel extends \Eloquent
{
    public function problems()
    {
        return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
    }
}

Problema telefónico:

class PhoneProblem extends \Eloquent
{
    public function models()
    {
        return $this->belongsToMany('PhoneModel')->withPivot('price');
    }
}

Lo que estoy tratando de hacer es obtener el precio de un teléfono específico con un problema específico.

Así es como lo tengo ahora, pero siento que Laravel tiene una característica Elocuente incorporada que no puedo encontrar para hacer esto de una manera mucho más simple:

$model = $this->phoneService->getModelFromSlug($model_slug);
$problem = $this->phoneService->getProblemFromSlug($problem_slug);

Todo lo que hace es seleccionar el modelo específico y el problema de su babosa.

Entonces lo que hago es que con esas credenciales obtengo el precio así:

$row = DB::table('phone_model_phone_problem')
->where('phone_model_id', '=', $model->id)
->where('phone_problem', '=', $problem->id)
->first();

Así que ahora puedo obtener el precio así $row->price pero siento que tiene que haber una manera mucho más fácil y más 'Laravel' de hacer esto.

Author: Rodrigo, 2014-10-26

2 answers

Cuando se utilizan relaciones de Muchos a Muchos con Eloquent, el modelo resultante obtiene automáticamente un atributo pivot asignado. A través de ese atributo, puede acceder a las columnas de la tabla dinámica. Aunque por defecto solo hay las claves en el objeto pivote. Para obtener sus columnas allí también, debe especificarlas al definir la relación:

return $this->belongsToMany('Role')->withPivot('foo', 'bar');

Documentos oficiales

Si necesitas más ayuda en la tarea de configurar las relaciones con Eloquent, déjame saber.

Editar

Para consultar el precio haga esto

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
 83
Author: lukasgeiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 20:20:29

A obtener datos de la tabla dinámica:

$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;

O si usted tiene muchos registros con diferente precio:

$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;

Además.

A update datos en el pivote puede ir NUEVA FORMA:

$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false); 

Donde el segundo parámetro se establece en falso, lo que significa que no se separan todos los otros modelos relacionados.

O, ve a la vieja usanza

$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);

Y les recuerdo:

A delete:

$model->problems()->detach($problemId);

Para crear nuevo:

$model->problems()->attach($problemId, ['price' => 22]);

Se ha probado y probado que funciona en Laravel 5.1 Leer más.

 9
Author: Yevgeniy Afanasyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 21:20:42