علیرضا مه آبادی
3 سال پیش توسط علیرضا مه آبادی مطرح شد
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 ویژگی محصول دوره پروژه محور راکت هست.
ممنون میشم راهنماییم کنید🙏🙏🙏


ثبت پرسش جدید
الیاس سخاوتی نیا
تخصص : علاقه‌مند به برنامه‌‎نویسی
@elyassir 3 سال پیش مطرح شد
1

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

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

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

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

فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

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


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 3 سال پیش مطرح شد
0

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

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


Armin Rahmati
@arminrahmati999 3 سال پیش مطرح شد
0

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

return $data['attributes'];

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 3 سال پیش مطرح شد
0

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

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

رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

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

dd($item);

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 3 سال پیش آپدیت شد
0

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

array:2 [▼
  "name" => "رنگ"
  "value" => "سبز"
]

رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

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

$data = $request->validate([
    'attributes' => 'array'
]);

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 3 سال پیش مطرح شد
0

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


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

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

dd($attr)

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


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 3 سال پیش مطرح شد
0

@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);
    }
}

فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

من توی کد مشکلی نمیبینم !!!!
این کد رو جایگزین ساخت 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 3 سال پیش مطرح شد
0

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


الیاس سخاوتی نیا
تخصص : علاقه‌مند به برنامه‌‎نویسی
@elyassir 3 سال پیش مطرح شد
1

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

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

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

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

الیاس سخاوتی نیا
تخصص : علاقه‌مند به برنامه‌‎نویسی
@elyassir 3 سال پیش مطرح شد
0

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

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

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

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