درود بر مهندسین گرامی 🌹بنده می خوام از طریق روابط از متد firstOrCreate استفاده کنم که در روابط به ارور بر می خورم و واقعا نمی دونم مشکل چیه!! فقط نمودونم چرا مقدار
$attr->values()
را null بر میگردونه!!
مربوط به این بخشه که کالکشن هست
public function store(Request $request)
{
$data = $request->validate([
'attributes' => ['required', 'array']
]);
//For Attributes
$attributes = collect($data['attributes']);
$attributes->each(function ($item) {
if (is_null($item['name']) || is_null($item['value'])) return;
$attr = Attribute::firstOrCreate(
['name' => $item['name']]
);
$attr_value = $attr->values()->firstOrCreate(
['value' => $item['value']]
);
dd($attr_value);
});
}
وقتی dd تست میگیرم این ارور میده البته create هم میگم همینه.
Call to a member function firstOrCreate() on null
روابط هم درسته اما این نال نمی دونم برا چیه
این بخش مربوط به جلسه 91 ویژگی محصول دوره پروژه محور راکت هست.
ممنون میشم راهنماییم کنید🙏🙏🙏
@aliasgharkashani1379
سلام این کد return نداره
public function values()
{
$this->hasMany(AttributeValue::class);
}
اینجوری باید باشه
public function values()
{
return $this->hasMany(AttributeValue::class);
}
سلام ، ببینید در این مواقع شما باید قدم به قدم خروجی بگیری تا متوجه مشکل بشید ، شما اینجا مطمعنی متغیر attr مقدار داره؟ ازش خروجی گرفتی؟
@eniack درود بر مهندس عزیز
بله وقتی خروجی میگیرم attr فیلد name ش ساخته میشه و فقط attr_value ساخته نمیشه!
سلام دوست عزیز.
این کدو بعد از خط 6 بنویسید و خروجی رو ببینید.
return $data['attributes'];
@arminrahmati999 درود بر مهندس عزیز
این خروجی میده:
array:2 [▼
0 => array:2 [▼
"name" => "رنگ"
"value" => "قرمز"
]
1 => array:2 [▼
"name" => "گارانتی"
"value" => "12 ماه"
]
]
سلام.
همانطور که دوستان فرمودن شما باید مرحله به مرحله dd بگیرن تا متوجه بشین.
لطف کنید بعد از خط 9 دستور زیر رو قرار بدین.
dd($item);
rezajahangir@ @rezajahangir درود بنده این ویژگی هارو گفتم و وقتی خروجی که شما گفتید گرفتم این برام برگشت داده شد.
array:2 [▼
"name" => "رنگ"
"value" => "سبز"
]
خط 3 تا 6 رو به صورت زیر تغییر بدین و مجدد امتحان کنید.
$data = $request->validate([
'attributes' => 'array'
]);
@rezajahangir مهندس انجام دادم اما تفاوتی با قبلی نکرد و فقط آیتم اول که شامل رنگ و نوع رنگ بود برگردوند. یعنی name و value اولی
خب تا اینجه درسته و مشکلی نیست.
خروجی کد زیر چیه؟
dd($attr)
و همچنین کد رابطه ای که واسه values داخل مدل نوشتین هم بفرستین.
@rezajahangir خروجی $attr:
#attributes: array:2 [▼
"name" => "رنگ"
"id" => 1
]
#original: array:2 [▼
"name" => "رنگ"
"id" => 1
]
کد روابط داخل مدل Attribute:
class Attribute extends Model
{
use HasFactory;
public $timestamps = false;
protected $fillable = ['name'];
public function values()
{
$this->hasMany(AttributeValue::class);
}
}
این هم مایگریشن attribute و value که روابط بینش یک به چند هست.
public function up()
{
Schema::create('attributes', function (Blueprint $table) {
$table->id();
$table->string('name');
});
Schema::create('attribute_value', function (Blueprint $table) {
$table->id();
$table->string('value');
$table->unsignedBigInteger('attribute_id');
$table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');
});
}
این هم مدل Attribute_value
class AttributeValue extends Model
{
use HasFactory;
public $timestamps = false;
protected $fillable = ['value'];
public function attribute()
{
$this->belongsTo(Attribute::class);
}
}
من توی کد مشکلی نمیبینم !!!!
این کد رو جایگزین ساخت table کنید ببینید چی میشه
Schema::create('attribute_values', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('attribute_id');
$table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');
$table->string('value');
$table->timestamps();
});
@eniack مهندس این کار هم انجام دادم اما بازم نشد!!1😐😐😐
واقعا دیگه نمی دونم چ کنم
ممنون از شما
حتما جدول هاشو هم جدو گونه در دوتا مایگریشن ایجاد کردم اما باز هم نشد.
@aliasgharkashani1379
سلام این کد return نداره
public function values()
{
$this->hasMany(AttributeValue::class);
}
اینجوری باید باشه
public function values()
{
return $this->hasMany(AttributeValue::class);
}
اون یکی دیگه هم همینطور return نذاشتین
public function attribute()
{
return $this->belongsTo(Attribute::class);
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟