I am a new in Laravel and I am trying to get the value from third column id in pivot table
I have 3 tables and 4th table is pivot table, so my table structure is as follow
- TABLE Product Structure
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->foreignId('category_id')->constrained();
$table->timestamps();
});
- Table Attributes Structure
Schema::create('attributes', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
- Table Attribute Value Structure
Schema::create('attribute_values', function (Blueprint $table) {
$table->id();
$table->string('value');
$table->foreignId('attribute_id')->constrained();
$table->timestamps();
});
- and I also make pivot table attribute_product
Schema::create('attribute_product', function (Blueprint $table) {
$table->foreignId('product_id')->constrained();
$table->foreignId('attribute_id')->constrained();
$table->foreignId('attribute_value_id')->constrained();
});
<<<<<<<<<<< MODELS OF TABLE >>>>>>>>>>>>>>>>>>>>>> 1.Table Product
class Product extends Model
{
use HasFactory;
public function attributes()
{
return $this->belongsToMany(Attribute::class)->using(AttributeProduct::class)->withPivot('attribute_value_id');
}
}
2.Table Attribute
class Attribute extends Model
{
use HasFactory;
public function products()
{
return $this->belongsToMany(Product::class)->using(AttributeProduct::class)->withPivot('attribute_value_id');
}
}
- Table Attribute Value
class AttributeValue extends Model
{
use HasFactory;
protected $guarded = [];
public function attribute_product()
{
return $this->hasMany(AttributeProduct::class, 'attribute_value_id');
}
}
AND also I make a model of pivot table
use Illuminate\Database\Eloquent\Relations\Pivot;
class AttributeProduct extends Pivot
{
use HasFactory;
public function value()
{
return $this->belongsTo(AttributeValue::class,'attribute_value_id');
}
}
<<<<<<<<<<<<<< DATA IN TABLES >>>>>>>>>>>>>>>>>>>>>>>>
- TABLE PRODUCT
ID TITLE category_id
6 Samsung S22 2
- TABLE ATTRIBUTE
ID NAME
1 SIZE
2 COLOR
- TABLE ATTRIBUTE VALUES
ID VALUE attribute_id
1 SM 1
2 M 1
3 RED 2
4 BLUE 2
- Pivot Table values attribute_product
product_id attribute_id attribute_value_id
6 1 1
6 2 4
Now I am using these commands in controller to find the value
$p = Product::find(6);
foreach($p->attributes as $value){
echo $value->name." = ". $value->pivot->attribute_value_id->value."<br>";
}
when I try to get the value on base of attribute_value_id from pivot table its give me this error
ErrorException Attempt to read property "value" on int
So how I can solve this problem.
Thanks
CodePudding user response:
The pivot relation value
should be a hasOne
, not a belongsTo
.
class AttributeProduct extends Pivot
{
use HasFactory;
public function value()
{
return $this->hasOne(AttributeValue::class, 'id', 'attribute_value_id');
}
}
So in your foreach
, you can now do:
foreach($p->attributes as $attribute){
echo $attribute->name." = ". $attribute->pivot->value->value."<br>";
}
Also try to keep your variable names straight. Don't write $p->attributes as $value
if $value
is clearly an $attribute
.