Ошибка при попытке вывести отношение Eloquent в Laravel - PullRequest
0 голосов
/ 21 мая 2018

Я получаю сообщение об ошибке "Попытка получить свойство 'company_name' не-объекта".Я изучил отношения Eloquent и попытался реализовать их в своем коде.Но это дает мне эту ошибку в представлении (products.show)

Какая часть неверна?

Можно ли иметь много других отношений с другой моделью?

В «Модель поставщика»:

public function getRouteKeyName()
{
    return 'roc_no';
}

public function user()
{
    return $this->belongsTo('App\User');
}

public function products()
{
    return $this->hasMany('App\Product');
}

В «Модель продукта»:

public function getRouteKeyName()
{
    return 'slug';
}

public function user()
{
    return $this->belongsTo('App\User');
}

public function vendor()
{
    return $this->belongsTo('App\Vendor');
}

В 'Модель пользователя':

    public function vendor()
    {
        return $this->hasOne('App\Vendor');
    }

    public function products()
    {
        return $this->hasMany('App\Product');
    }

    public function roles()
    {
        return $this->belongsToMany('App\Role', 'role_users');
    }

В 'products.show':

...    
{!! $product->description !!}
<!-- The error is at $product->vendor->company_name -->
Company Name: <a href="/vendors/{{ $product->vendor_roc_no }}">{{ $product->vendor->company_name }}</a>

В 'ProductController':

    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|string|max:255',
            'slug' => 'required|string|max:100',
            'description' => 'required',
            'image' => 'nullable',
        ]);

        $product = new Product;
        $product->name = $request->name;
        $product->slug = $request->slug;
        $product->description = $request->description;
        $product->vendor_roc_no = auth()->user()->vendor->roc_no;
        $product->save();

        return redirect('/account/products')->with('success', 'Product added successfully.');
    }

    public function show(Product $product)
    {    
        return view('products.show')->with('product', $product);
    }

Обновлено: в таблице поставщиков:

Schema::create('vendors', function (Blueprint $table) {
            $table->increments('id');
            $table->string('company_name');
            $table->string('roc_no');
            $table->string('company_address');
            $table->string('company_tel');
            $table->string('company_fax')->nullable();
            $table->string('company_email');
            $table->string('company_website')->nullable();
            $table->string('company_logo')->nullable();
            $table->text('company_profile')->nullable();
            $table->unsignedInteger('user_id');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
        });

В таблице продуктов:

Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('slug')->unique();
            $table->text('description');
            $table->string('image')->nullable();
            $table->string('vendor_roc_no');
            $table->timestamps();

            // $table->foreign('vendor_id')->references('id')->on('vendors');
        });

1 Ответ

0 голосов
/ 21 мая 2018

Насколько я знаю, вам нужно установить отношения для доступа к свойствам из другой модели, поэтому в этом случае вы хотите получить название компании, которое находится у поставщика, для этого вам нужно будет сообщить своемумодель принести продавцу.Пример:

$user->with('anyRelation')->get();
// Then you can use like, $user->anyRelation->property;

Теперь я заметил кое-что в вашем методе show, вы отправляете класс Product, но не eloquent объект, может быть, просто использование Eloquent поможет?Пример

$products = Product:all(); // this would return every record on your db
return view('products.show')->with('products', $products);

Надеюсь, это поможет :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...