2016-10-23 8 views
2

Прежде всего, я хочу извиниться за нить, и я знаю, что на SO есть тонны подобных потоков. После прочтения на них я не могу понять, что происходит на моем сайте. Рамки - Laravel-4.2Понимание «Попытка получить свойство не-объекта» и его предотвращение

Пара часов в порядке, и все работает отлично. Сейчас несколько страниц получают Trying to get property of non-object, когда я пытаюсь получить к ним доступ. Не все страницы .. только 2-3.

Например, это в моем контроллере для отображения всех заказов.

public function orders() { 

    $orders = Order::select('*')->orderBy('order_id', 'DESC')->paginate(5); 
    return View::make('site.admin.orders', [ 
     'orders' => $orders 
    ]); 
} 

И это, на мой взгляд

@foreach($orders as $order) 
<tr> 
    <td class="text-center">{{ $order->order_id }}</td> 
    <td class="text-center">{{ $order->user->username }}</td> 

    // few more <td>`s 
</tr> 
@endforeach 

Ошибка на первом <td>:

<td class="text-center">{{ $order->order_id }}</td> 

Таже часть кода работает на другом сайте (копия этого одного). Я знаю, что в этой ситуации я могу просто изменить $order->order_id на $order['order_id'] ...

Почему это происходит? Как предотвратить это? Я не понимаю природу этой ошибки. И это очень странно для меня, потому что это работает на точной копии сайта.

Update: Это мой Модель:

public function getOrderData($data) { 

    $dataArray = json_decode($data, true); 
    $data = json_decode($data); 
    $arrayKeys = array_keys($dataArray); 
    $arrayKeys = array_filter($arrayKeys, function($value) { 
     return ($value !== 'shipping'); 
    }); 
    $productIds = implode(',', $arrayKeys); 


    $products = DB::table('products') 
     ->leftjoin('category', 'products.category_id', '=', 'category.category_id') 
     ->leftjoin('sub_category', 'products.sub_cat_id', '=', 'sub_category.sub_cat_id') 
     ->where('product_id',$productIds) 
     ->get();    

    foreach ($products as $item) { 
     if(!in_array($item->product_id, $arrayKeys)) continue; 
     $dataArray[$item->product_id]['category'] = $item->category_name; 
     $dataArray[$item->product_id]['sub_category'] = $item->sub_cat_name; 

    } 
    return json_decode(json_encode($dataArray)); 
} 
+0

Похоже, что Eloquent ORM жонглирует между массивом и представлением объектов результатов запроса ... –

+0

Хорошо. Я также добавил свою модель. Что это значит? Как можно моделировать «решить» массив или объект? – Garg

+0

И как этот кусок кода работать на сайте на том же сервере, но в другой папке. Но не будет работать в другой папке? Я действительно смущен. – Garg

ответ

2

«Попытка получить свойство не-объекта» означает, что вы пытаетесь получить то, чего не существует. В классах ООП объект и объект имеют связанные с ними свойства. Вы можете получить доступ к этим свойствам, если они существуют.

В вашем случае его не существует. Чтобы преодолеть это использование Исеть() перед обращением к ценности, как:

isset($order->order_id) ? $order->order_id : 'NA'; 

В этом случае, если свойство не существует, чем код не будет бросать ошибку, вместо этого он будет идти еще части и печати Н. А.

+0

Хорошо, ты прав. Я пробовал, и у меня есть «NA». Но почему?Я имею в виду, что мои данные по моделированию данных из базы данных не означают, что после того, как они вытащили '$ orders', были объекты? У меня есть 10 заказов в таблице базы данных, и если я правильно понимаю это означает, что это говорит мне, что ничего нет? – Garg

+0

Также перед моим foreach у меня есть @if (count ($ orders)> 0) .... ' – Garg

+0

' var_dump ($ orders) 'tight после запроса возвращает много объектов (Illuminate \ ....' Также все заказы из базы данных – Garg

2

Это означает, что вы пытаетесь получить доступ к собственности что-то, что не является объектом. Например, если вы делаете что-то вроде этого

$model = MyModel::model()->findByPk('non_existent_primary_key'); 

$model будет null, так что если вы

echo $model->id; 

вы получите эту ошибку.

+0

Хорошо. Теперь я урезал таблицы заказов и страницы. Можете ли вы объяснить, что произойдет? – Garg