Ошибка при попытке вывода отношения Eloquent в Laravel

Я получаю сообщение об ошибке «Пытаюсь получить свойство« имя_компании », не являющееся объектом». Я изучал отношения 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');
        });

Похоже, у вас есть хотя бы один поставщик, с которым не связан поставщик. Вы должны проверить, существует ли поставщик, прежде чем пытаться его использовать. Если вы используете Laravel 5.5+, вам может пригодиться функция по желанию().

BizzyBob 21.05.2018 17:32

Что ты имеешь в виду? Извините, я все еще новичок и у меня меньше опыта работы с Laravel и фреймворком. Я думаю, что определение отношений правильное, не так ли? О, когда я использую вспомогательную функцию optional (), она возвращает null вместо ошибки.

Azwan Abdullah 21.05.2018 17:49

Думаю, нет, но без таблиц сложно сказать. Попробуйте это: return $this->belongsTo('App\Vendor', 'vendor_roc_no');

DevK 21.05.2018 17:52

@devk все еще не работает. Я обновил вопрос.

Azwan Abdullah 21.05.2018 18:09

Попробуйте return $this->belongsTo('App\Vendor', 'vendor_roc_no', 'roc_no');.

Jonas Staudenmeir 21.05.2018 18:27

Спасибо, теперь сработало. :) Теперь заметил, что в docs. Между прочим, трудно понять эти причудливые термины в этих документах.

Azwan Abdullah 21.05.2018 18:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
593
1

Ответы 1

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

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

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

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

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

Я узнал, что где-нибудь еще при использовании привязки модели необязательно запрашивать записи. И я попробовал, если меня изменили, как вы упомянули, это также дает ошибку :(

Azwan Abdullah 21.05.2018 18:20

Возможно ли, что company_name - это не свойство объекта, а массив? так что это было бы похоже на $product->vendor['company_name'], просто здесь немного догадываюсь

falcon1812 21.05.2018 18:28

Я не думаю, что ни то, ни другое, потому что company_name возвращает ноль.

Azwan Abdullah 21.05.2018 18:43

не могли бы вы распечатать все, что есть на $product->vendor? это может помочь увидеть, что находится внутри. Другая идея, которую я получаю, - это просто попытаться самостоятельно запросить поставщика и посмотреть, что вы от него получите, может быть, модель работает неправильно или что-то в этом роде :)

falcon1812 21.05.2018 18:47

Задача решена. Я сделал это, как упоминал @JonasStaudenmeir. Кстати, спасибо за помощь. :)

Azwan Abdullah 21.05.2018 18:47

Другие вопросы по теме