Solución:
Cuando se utilizan relaciones Many to Many con Eloquent, el modelo resultante obtiene automáticamente una pivot
atributo asignado. A través de ese atributo, puede acceder a las columnas de la tabla dinámica. Aunque por defecto solo existen las claves en el objeto pivote. Para incluir 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, házmelo saber.
Editar
Para consultar el precio haz esto
$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
Para obtener datos de la tabla dinámica:
$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;
O si tienes muchos discos con precio diferente:
$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;
Además.
Para actualizar datos en el pivote puede ir NUEVA MANERA:
$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false);
Donde el segundo parámetro se establece en falso, lo que significa que no separa todos los demás modelos relacionados.
O ir vieja forma
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
Y te recuerdo:
Para Eliminar:
$model->problems()->detach($problemId);
Para crear nuevo:
$model->problems()->attach($problemId, ['price' => 22]);
Se ha probado y se ha demostrado que funciona en Laravel 5.1 Leer más.
Laravel 5.8 ~
Si desea crear un modelo de pivote personalizado, puede hacer esto:
Account.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Account extends Model
{
public function users()
{
return $this->belongsToMany(User::class)
->using(AccountUserPivot::class)
->withPivot(
'status',
'status_updated_at',
'status_updated_by',
'role'
);
}
}
AccountUserPivot.php
<?php
namespace App;
use IlluminateDatabaseEloquentRelationsPivot;
class AccountUserPivot extends Pivot
{
protected $appends = [
'status_updated_by_nice',
];
public function getStatusUpdatedByNiceAttribute()
{
$user = User::find($this->status_updated_by);
if (!$user) return 'n/a';
return $user->name;
}
}
En el ejemplo anterior, Account
es tu modelo normal, y tienes $account->users
que tiene el account_user
unir tabla con columnas estándar account_id
y user_id
.
Si crea un modelo de pivote personalizado, puede agregar atributos y mutadores en las columnas de la relación. En el ejemplo anterior, una vez que crea el modelo AccountUserPivot, le indica a su modelo de Cuenta que lo use a través de ->using(AccountUserPivot::class)
.
Luego puede acceder a todo lo que se muestra en las otras respuestas aquí, pero también puede acceder al atributo de ejemplo a través de $account->user[0]->pivot->status_updated_by_nice
(asumiendo que status_updated_by
es una clave externa a un ID en la tabla de usuarios).
Para obtener más documentos, consulte https://laravel.com/docs/5.8/eloquent-relationships (y recomiendo presionar CTRL + F y buscar “pivote”)