راکت
حل شده

مشکل در Polymorphic Relation

12 پاسخ

سلام خسته نباشید.
ارور:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'category_category_id' in 'field list' (SQL: select `category_category_id` from `categorizables` where `categorizable_id` = 25 and `categorizable_type` = App\Package)

مدل پکیج:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories';
    protected $primaryKey = 'category_id';
    public $timestamps = false;

    protected  $fillable = ['category_name'];

    public function Package()
    {
        return $this->morphedByMany(Package::class, 'categorizable');
    }
}

مدل دسته بندی:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Package extends Model
{
    protected $table = 'packages';
    protected $primaryKey = 'package_id';
    protected $guarded = 'package_id';
    protected $fillable = ['package_title', 'package_price'];

    public function File()
    {
        return $this->belongsToMany(File::class, 'file_package', 'package_id', 'file_id');
    }

    public function Package()
    {
        return $this->belongsToMany(User::class, 'user_packages', 'package_id', 'user_id')->withPivot(['amount', 'created_at']);
    }

    public function Categories()
    {
        return $this->morphToMany(Category::class, 'categorizable');
    }
}

کنترولر پکیج:

public function store(Request $request)
    {
        $this->validate($request, [
            'package_title' => 'required',
            'package_price' => 'required'
        ]);

        $NewPackage = Package::create([
            'package_title' => $request->input('package_title'),
            'package_price' => $request->input('package_price')
        ]);

        if ($request->has('categories')) {
            $NewPackage->Categories()->sync($request->input('categories'));
        }

        if ($NewPackage) {
            return redirect()->route('admin.package.list')->with('success', 'با موفقیت اضافه شد');
        }
    }

دیتابیس:

categories { category_id,category_name}
categorizables {category_id,categorizable_id,categorizable_type}

@hesammousavi
@ali.bayat

ثبت پرسش جدید

پاسخ‌ها

12
حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

بهترین پاسخ

در جای که morphToMany رو تعریف میکنید فیلد ها رو هم بگید کدوم به کدومه
چون اصولا در categories باید id باشه نه category_id این بد بختم (لاراول) متوجه نمیشه پس باید بهش بفهمونید در اون متد

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

@hesammousavi
خوب درسته بهش گفتم کدوم به کدومه بازم هیچ فرقی نکرد

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

@hesammousavi
میشه نمونه نشونم بدید؟!

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

@mrkiani.dev
بله تغییری که نمایش دادید رو بفرستید
ارورتون رو هم ببینید نشون دهنده این هست که مشکلتون مربوط به پیاده سازی روابط هست
البته من پیشنهاد میکنم در جدول categories بجای قرار دادن category_id و category_name
فقط قرار بدیم id و name
چه کاریه واقعا

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

من فیلد های جدول categories رو به id و name تغیر دادم

Category Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories';
    protected $primaryKey = 'id';
    public $timestamps = false;

    protected  $fillable = ['name'];

    public function Package()
    {
        return $this->morphedByMany(Package::class, 'categorizable_type', 'categorizables' , 'categorizable_id' , 'category_id');
    }
}

Package Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Package extends Model
{
    protected $table = 'packages';
    protected $primaryKey = 'package_id';
    protected $guarded = 'package_id';
    protected $fillable = ['package_title', 'package_price'];

    public function File()
    {
        return $this->belongsToMany(File::class, 'file_package', 'package_id', 'file_id');
    }

    public function Package()
    {
        return $this->belongsToMany(User::class, 'user_packages', 'package_id', 'user_id')->withPivot(['amount', 'created_at']);
    }

    public function Categories()
    {
        return $this->morphToMany(Category::class, 'category_id' , 'categorizables' , 'category_id' , 'categorizable_id');
    }
}

من درست این Polymorphic relationships درک نکردم بخاطر همینه که اشتباه می کنم

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

متن ارور

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'category_id_type' in 'where clause' (SQL: select `categorizable_id` from `categorizables` where `category_id` = 32 and `category_id_type` = App\Package)
محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

فهمیدم مشکل کجاست

درست شد

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

@hesammousavi

Category Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories';
    protected $primaryKey = 'id';
    public $timestamps = false;

    protected  $fillable = ['name'];

    public function Package()
    {
        return $this->morphedByMany(Package::class, 'categorizable', 'categorizables' , 'categorizable_id' , 'category_id');
    }
}

Package Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Package extends Model
{
    protected $table = 'packages';
    protected $primaryKey = 'package_id';
    protected $guarded = 'package_id';
    protected $fillable = ['package_title', 'package_price'];

    public function File()
    {
        return $this->belongsToMany(File::class, 'file_package', 'package_id', 'file_id');
    }

    public function Package()
    {
        return $this->belongsToMany(User::class, 'user_packages', 'package_id', 'user_id')->withPivot(['amount', 'created_at']);
    }

    public function Categories()
    {
        return $this->morphToMany(Category::class, 'categorizable' , 'categorizables' , 'category_id' , 'categorizable_id');
    }
}

اینا گذاشتم که بدونند مشکل از کجا بوده ، ممنون بابت راهنمایی تون

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

با این حال عمیقا پیشنهاد میکنم در کدی که نوشتید بازنگری کنید دیگه داخل جدول packages نیاید فیلد package_id قرار بدید همون اسم id بهترین حالته
نیاید داخل جدول categories فیلد category_id بزارید همون id درست‌تره.
اینکه شم ااینا رو تغییر میدید فقط باعث کثیف شدن کدهاتون میشه
البته از ما گفتن بود

محمدرضا کیانی
محمدرضا کیانی
@MoReKiani

تخصص: توسعه دهنده وب و موبایل

@hesammousavi
تجربه شما از تجربه من خیلی بیشتره و حتما از نکات شما استفاده میکنم :) ممنون

سانبوی
سانبوی
@royalkingsiminof

سلام .

من یه خطا توی بخش پلی مورفیک ریلیشن شیپ دارم


Route::get('user/photo',function(){  
$user = \\App\\User::find(1);  
foreach ($user-&gt;photos as $photo){  
echo $photo-&gt;path;  
echo "&lt;/br&gt;";  
}  
});

Invalid argument supplied for foreach()

دستور فور ایچ کار نمیکنه

همه جارم بررسی کردم. مشکل از Foreach هستش

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

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