2017-02-18 22 views
0

Hi Я работаю над проектом обучения laravel. У меня проблема с моделями и отношениями, когда я пытаюсь получить имя каждой категории продукта.
Вот моя Модель продуктаКатегория отношений в laravel Undefined property: stdClass ::

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Product extends Model 
{ 
    public function category() 
    { 
    return $this->belongsTo('App\Category'); 
    } 
} 

и моя Категория модель

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Category extends Model 
{ 
    protected $table = 'categories'; 

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

, когда я пытаюсь получить название категории для каждого продукта, как этого

 @foreach($products as $product) 
     <tr> 
     <td>{{ $product->id }}</td> 
     <td>{{ $product->name }}</td> 
     <td>{{ $product->category->name }}</td> 
     </tr> 
     @endforeach 

в то время как я запустить страница я получаю эту ошибку

Undefined property: stdClass::$category (View: /var/www/html/projectname/resources/views/my/products/index.blade.php) 

может кто-нибудь сказать мне, что вызывает эту ошибку?

обновление
здесь структура таблицы
продукты: идентификатор, имя, category_id-> без знака()
Категории: идентификатор, имя
и вот код я использую, чтобы получить $ продукты

$user_id = Auth::user()->id; 
    $products = DB::table('products')->where('user_id', $user_id)->paginate(5); 
    return view('my.products.index')->withProducts($products); 
+0

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

+0

@OdinThunder я обновил пост увидеть структуру таблиц. и вернитесь ко мне –

+0

Ваше сообщение об ошибке предполагает, что '$ product' является объектом/stdClass, а не экземпляром вашей модели« Product ». Можете ли вы опубликовать код, который вы использовали для получения переменной '$ products'? – Jonathon

ответ

2

Ваша проблема в том, что вы используете построитель запросов Laravel вместо Eloquent, но вы обрабатываете результат так, как если бы он был Красноречивым.

Когда вы делаете:

$products = DB::table('products')->where('user_id', $user_id)->paginate(5); 

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

$products = Product::with('category')->where('user_id', $user_id)->paginate(5); 

Это будет гарантировать, что возвращенные детали в постраничной навигации являются экземплярами ваших Product красноречивых моделей с category отношений стремятся нагруженным (Т.е. он будет загружать отношения категории для каждого Product, возвращенного с использованием одного запроса, а не 5 запросов, по одному на каждые Product).

Затем вы должны быть в состоянии получить доступ к $product->category->name.

+0

Спасибо, ты гений. Я не могу поверить, что сделал такую ​​ошибку. –

+0

Добро пожаловать. Рад, что это помогло вам:] – Jonathon