راکت
حل شده

ارور مربوط به روابط در لاراول

14 پاسخ

درود بر مهندسین گرامی 🌹بنده می خوام از طریق روابط از متد 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 ویژگی محصول دوره پروژه محور راکت هست.
ممنون میشم راهنماییم کنید🙏🙏🙏

ثبت پرسش جدید

پاسخ‌ها

14
الیاس سخاوتی نیا
الیاس سخاوتی نیا
@elyassir

تخصص: علاقه‌مند به برنامه‌‎نویسی

بهترین پاسخ

@aliasgharkashani1379
سلام این کد return نداره

    public function values()
    {
        $this->hasMany(AttributeValue::class);
    }

اینجوری باید باشه

    public function values()
    {
        return $this->hasMany(AttributeValue::class);
    }
فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

سلام ، ببینید در این مواقع شما باید قدم به قدم خروجی بگیری تا متوجه مشکل بشید ، شما اینجا مطمعنی متغیر attr مقدار داره؟ ازش خروجی گرفتی؟

علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

@eniack درود بر مهندس عزیز

بله وقتی خروجی میگیرم attr فیلد name ش ساخته میشه و فقط attr_value ساخته نمیشه!

شاید پاسخ شما همین‌جا باشد

Armin Rahmati
Armin Rahmati
@arminrahmati999

سلام دوست عزیز.
این کدو بعد از خط 6 بنویسید و خروجی رو ببینید.

return $data['attributes'];
علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

@arminrahmati999 درود بر مهندس عزیز
این خروجی میده:

array:2 [▼
  0 => array:2 [▼
    "name" => "رنگ"
    "value" => "قرمز"
  ]
  1 => array:2 [▼
    "name" => "گارانتی"
    "value" => "12 ماه"
  ]
]
رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

سلام.
همانطور که دوستان فرمودن شما باید مرحله به مرحله dd بگیرن تا متوجه بشین.
لطف کنید بعد از خط 9 دستور زیر رو قرار بدین.

dd($item);
علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

rezajahangir@ @rezajahangir درود بنده این ویژگی هارو گفتم و وقتی خروجی که شما گفتید گرفتم این برام برگشت داده شد.
توضیح تصویر رو وارد کنید

array:2 [▼
  "name" => "رنگ"
  "value" => "سبز"
]
رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

خط 3 تا 6 رو به صورت زیر تغییر بدین و مجدد امتحان کنید.

$data = $request->validate([
    'attributes' => 'array'
]);
علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

@rezajahangir مهندس انجام دادم اما تفاوتی با قبلی نکرد و فقط آیتم اول که شامل رنگ و نوع رنگ بود برگردوند. یعنی name و value اولی

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

خب تا اینجه درسته و مشکلی نیست.
خروجی کد زیر چیه؟

dd($attr)

و همچنین کد رابطه ای که واسه values داخل مدل نوشتین هم بفرستین.

علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

@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);
    }
}
فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

من توی کد مشکلی نمیبینم !!!!
این کد رو جایگزین ساخت 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();
        });
علیرضا مه آبادی
علیرضا مه آبادی
@aliasgharkashani1379

تخصص: در حال یادگیری لاراول

@eniack مهندس این کار هم انجام دادم اما بازم نشد!!1😐😐😐
واقعا دیگه نمی دونم چ کنم
ممنون از شما
حتما جدول هاشو هم جدو گونه در دوتا مایگریشن ایجاد کردم اما باز هم نشد.

الیاس سخاوتی نیا
الیاس سخاوتی نیا
@elyassir

تخصص: علاقه‌مند به برنامه‌‎نویسی

اون یکی دیگه هم همینطور return نذاشتین

    public function attribute()
    {
        return $this->belongsTo(Attribute::class);
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام