Salut les gars, voici ma première question sur le débordement de pile.
Je reçois le message d'erreur suivant:
Essayer d'obtenir la propriété d'un non-objet
Lorsque j'essaie de consulter une facture remboursée dans le système. Toute aide est très appréciée! Merci beaucoup!
Voici le code complet du fichier:
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
La ligne de code qui contient l'erreur est ci-dessous: p >
<?php
namespace App\Http\Controllers;
use App\Addon;
use App\Invoice;
use App\Package;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use App\PackagesCustomPrices;
use App\BookingSlot;
use App\BookingTime;
use App\Booking;
use Dompdf\Dompdf;
use App\Exports\InvoiceExport;
use Excel;
class AdminInvoicesController extends Controller
{
/*
|--------------------------------------------------------------------------
| Admin Invoices Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for providing invoices views to admin.
|
*/
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function export()
{
return Excel::download(new InvoiceExport, 'invoices.xlsx');
}
public function index()
{
$invoices = Invoice::select('invoices.*', 'bookings.first_name as first_name', 'bookings.last_name as last_name', 'bookings.id as booking_id', 'bookings.phone as phone')
->join('bookings', 'bookings.id', 'invoices.booking_id')
->where('invoices.archived', 0)->with('booking')->get();
return view('invoices.index', compact('invoices'));
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$invoice = Invoice::findOrFail($id);
//get package and addons
$package = Package::find($invoice->booking->package->id);
$addons = DB::table('addon_booking')->where('booking_id', '=', $invoice->booking_id)->get();
// $package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->first();
$exp_booking = explode(" - ",$invoice->booking->booking_time);
list($month,$day,$year) = explode('-', $invoice->booking->booking_date);
$timestamp = mktime(0, 0, 0, $month, $day, $year);
$event_date = date('d-m-Y', $timestamp);
//get day name to select slot timings
$timestamp_for_event = strtotime($event_date);
$today_number = date('N', $timestamp_for_event);
$its_holiday = BookingTime::where('today_is','=',$invoice->booking->booking_date)->first();
if(isset($its_holiday->id))
{
$today_number = $its_holiday->id;
}
$get_slot = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->first();
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
if(isset($package_custom->price))
{
$total = $package_custom->price;
}
else
{
$total = $package->price;
}
$invoice->booking->package->price = $total;
//calculate total
//add addons price if any
// foreach($addons as $addon)
// {
// $total = $total + Addon::find($addon->addon_id)->price;
// }
if($invoice->promo_discount)
{
$coupon = \App\CouponCode::where('code', $invoice->promo_used)->first();
if($coupon->extra_items == 0){
if($invoice->promo_discount)
{
$discount = ($invoice->promo_discount / 100) * $total;
$total = $total - $discount;
}
foreach($addons as $addon)
{
$total = $total + Addon::find($addon->addon_id)->price;
}
}
else{
foreach($addons as $addon)
{
$total = $total + Addon::find($addon->addon_id)->price;
}
if($invoice->promo_discount)
{
$discount = ($invoice->promo_discount / 100) * $total;
$total = $total - $discount;
}
}
}
else{
foreach($addons as $addon)
{
$total = $total + Addon::find($addon->addon_id)->price;
}
}
// print_r($total);
// if($invoice->promo_discount)
// {
// $discount = ($invoice->promo_discount / 100) * $total;
// $total = $total - $discount;
// }
// print_r($discount);
// print_r($total);
// exit();
if(!$invoice->promo_discount && config('settings.enable_gst'))
{
$gst_amount = round(( config('settings.gst_percentage') / 100 ) * $total, 2);
}
else if($invoice->promo_discount && config('settings.enable_gst'))
{
if(config('settings.paypal_processing_fee') && $invoice->payment_method == __('app.paypal')){
$total = $invoice->amount - (float) config('settings.paypal_processing_fee');
// print_r($total);
$gst_amount = round(( config('settings.gst_percentage') / 100 ) * $total, 2);
}
elseif (config('settings.stripe_processing_fee') && $invoice->payment_method == __('app.credit_card')) {
$total = $invoice->amount - (float) config('settings.stripe_processing_fee');
// print_r($total);
$gst_amount = round(( config('settings.gst_percentage') / 100 ) * $total, 2);
}
}
else
{
$gst_amount = 0;
}
// exit();
return view('invoices.view', compact('invoice','gst_amount', 'total', 'discount'));
}
public function print($id)
{
$invoice = Invoice::findOrFail($id);
//get package and addons
$package = Package::find($invoice->booking->package->id);
$addons = DB::table('addon_booking')->where('booking_id', '=', $invoice->booking_id)->get();
// $package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->first();
$exp_booking = explode(" - ",$invoice->booking->booking_time);
list($month,$day,$year) = explode('-', $invoice->booking->booking_date);
$timestamp = mktime(0, 0, 0, $month, $day, $year);
$event_date = date('d-m-Y', $timestamp);
//get day name to select slot timings
$timestamp_for_event = strtotime($event_date);
$today_number = date('N', $timestamp_for_event);
$its_holiday = BookingTime::where('today_is','=',$invoice->booking->booking_date)->first();
if(isset($its_holiday->id))
{
$today_number = $its_holiday->id;
}
$get_slot = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->first();
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
if(isset($package_custom->price))
{
$total = $package_custom->price;
}
else
{
$total = $package->price;
}
//calculate total
$invoice->booking->package->price = $total;
//add addons price if any
foreach($addons as $addon)
{
$total = $total + Addon::find($addon->addon_id)->price;
}
if($invoice->promo_discount)
{
$discount = ($invoice->promo_discount / 100) * $total;
$total = $total - $discount;
}
if(config('settings.enable_gst'))
{
$gst_amount = round(( config('settings.gst_percentage') / 100 ) * $total, 2);
}
else
{
$gst_amount = 0;
}
// instantiate and use the dompdf class
// print_r(base_path() . "/vendor/autoload.php");
require base_path() . "/vendor/autoload.php";
$dompdf = new Dompdf();
$dompdf->set_option('isHtml5ParserEnabled', true);
$view_hello = view('invoices.print', compact('invoice','gst_amount', 'total', 'discount'));
$dompdf->loadHtml(utf8_decode($view_hello));
// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream("welcome.".date("ymdhis").".pdf", array("Attachment"=>0));
//return view('invoices.view', compact('invoice','gst_amount', 'total', 'discount'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$invoice = Invoice::find($id);
$invoice->update([
'is_paid' => 1
]);
return redirect()->route('invoices.index');
}
public function delete_all(Request $request)
{
$values = explode(',', $request->delete_values);
// print_r($values);
// exit();
foreach ($values as $value) {
if($value === null || empty($value)){
continue;
}
$invoice = Invoice::findorFail($value);
$booking = Booking::find($invoice->booking_id);
if($booking){
$booking->addons()->detach();
$booking->delete();
}
//delete event if google calendar sync is enabled
if(config('settings.sync_events_to_calendar') && config('settings.google_calendar_id') && $booking->google_calendar_event_id != NULL)
{
try {
//remove google calendar event
$event = Event::find($booking->google_calendar_event_id);
$event->delete();
} catch(\Exception $ex) {
//do nothing
}
}
$invoice->delete();
}
Session::flash('booking_deleted', __('backend.invoice_deleted'));
return redirect()->route('invoices.index');
}
}
4 Réponses :
presque $ facture ou $ get_slot est vide ou renvoie un objet tableau ou n'a pas la propriété souhaitée, vous ne pouvez donc pas obtenir la propriété de l'objet.
vous pouvez utiliser if (! empty ($ facture) &&! empty ($ get_slot)) pour vérifier l'objet non vide.
vous pouvez également utiliser la fonction dd () pour connaître les données renvoyées dans chaque objet.
if ($invoice && $invoice->booking && $invoice->booking->package && $get_slot){
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
}
one of the variables can be null. You should check
Erha, merci beaucoup, j'ai remplacé ma ligne de code par la vôtre et cela a fonctionné. Je peux voir la facture maintenant, mais la ligne de sous-total indique 0,0 $ sur la facture pour une raison quelconque, la ligne de code ne tire pas le montant du sous-total approprié? Des idées?
où est le sous-total?
Le problème avec cette solution est que vous ne parvenez pas à découvrir quel est le problème. Cette solution évite simplement que l'erreur globale soit générée, mais ne résout pas le problème sous-jacent qui est que vous avez une variable non définie que vous essayez d'atteindre.
erhan, si je comprends votre code, il dit essentiellement au système d'exécuter le code même si une valeur est nulle correcte? Le problème ici est que lorsqu'un client a réservé cet article, son prix était différent, mais le prix a changé, c'est pourquoi, lorsque je regarde la facture, je dis que l'ancienne valeur n'est pas trouvée. Vous ne savez pas si cela a du sens?
En fait, il fait le contraire, il dit au système de sauter la ligne suivante si l'une de ces valeurs est nulle. C'est pourquoi vous n'obtenez pas l'erreur, mais vous n'obtenez pas le résultat attendu. Ce qui bien sûr ne résout pas vraiment votre problème, vous sautez simplement les parties qui génèrent des erreurs, mais cette erreur est là pour une raison, qui est que quelque chose manque dans votre logique, il vous suffit de déterminer ce que c'est plutôt que de simplement sauter la partie qui jette la grosse erreur laide.
En bref, vous essayez d'obtenir une valeur de propriété d'une variable qui n'a pas de valeur. À partir de votre code, il peut provenir de $ facture ou de $ get_slot.
La première étape consiste à identifier les variables qui posent le problème. dd () est idéal pour cela car dd = signifie die and dump, qui renvoie simplement la valeur et arrête l'exécution.
Vous devez donc insérer dd () juste avant votre ligne de problème: p >
$query = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->toSql();
dd($query);
$get_slot = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->first();
Maintenant, gardez à l'esprit que dd () mourra après son vidage, vous ne verrez donc que le retour de la première valeur que vous avez testée.
Donc, si dd ($ facture) renvoie une valeur, commentez-la simplement comme:
$get_slot = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->first();
// dd($invoice);
dd($invoice->booking);
dd($invoice->booking->package);
dd($get_slot);
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
Si celle-ci renvoie une valeur, continuez à commenter jusqu'à ce que vous trouviez celui qui est nul.
Alors disons que le problème vient de $ get_slot, alors vous pouvez vider la requête sql pour déterminer quel est le problème.
Vous pourrait faire cela obtenir le SQL de la requête $ get_slot avant la ligne $ get_slot avec:
$get_slot = BookingSlot::where('opening','=',trim($exp_booking[0]))->where('closing','=',trim($exp_booking[1]))->where('booking_time_id','=',$today_number)->first();
dd($invoice);
dd($invoice->booking);
dd($invoice->booking->package);
dd($get_slot);
$package_custom = PackagesCustomPrices::where('package_id','=',$invoice->booking->package->id)->where('slot_id','=',$get_slot->id)->first();
Apportez cette requête à votre client SQL pour essayer de comprendre pourquoi il ne renvoie pas de valeur . Ce qui, bien sûr, peut être que $ today_number ou $ exp_booking n'ont pas ce que vous attendez, ou vous manquez des données, ou vous avez un problème avec la conception de votre base de données. Mais cela vous donne les outils nécessaires pour déterminer quel est le problème.
Arturo merci pour votre aide J'ai fait ce que vous m'avez conseillé de faire et j'obtiens un "null" sur ce qui suit: dd ($ get_slot; J'ai également ajouté le code complet du fichier sur mon message d'origine Je ne sais pas quoi faire après cela?
Ok, donc le problème est que la requête pour get_slot ne renvoie tout simplement aucune valeur. Si vous utilisez mysql, vous pouvez lui faire enregistrer toutes vos requêtes, ce que j'ai déjà fait pour m'assurer que ma logique est correcte. stackoverflow.com/questions/6479107/… < / a>. Cependant, vous pouvez commencer par vider simplement la requête de get slot et l'exécuter dans votre client sql afin que vous puissiez déterminer quel est le problème avec la requête. Je vais mettre à jour la réponse pour montrer comment vous pouvez faire cela.
Arturo, j'ai découvert le problème. Le système sur lequel je travaille est un système de réservation de bateaux en ligne. La facture que j'essayais de consulter a été traitée avec une ancienne tarification dans la base de données. Les prix ont maintenant changé, donc je suppose que l'erreur est générée parce que l'ancien prix sur l'article de la facture n'existe plus dans la base de données. Ainsi, lorsque la requête s'exécute, l'ancien prix ne correspond pas au nouveau prix, donc la valeur est maintenant nulle? Existe-t-il un moyen de stocker les valeurs des factures dans une table distincte pour éviter ce type de problèmes?
Jesse, bien sûr, vous pouvez l'appeler facture-nouvelle. Mais je ne pense pas que ce sera la meilleure approche à long terme. La question est la suivante: avez-vous besoin de conserver la compatibilité avec l'ancienne tarification de la facture? Ou ne pouvez-vous pas simplement migrer les anciennes données à la fois vers la nouvelle tarification? Je vous suggère de migrer si possible, mais si vous ne pouvez vraiment pas alors oui, ayez deux tableaux de facturation. Mais cela peut être déroutant plus tard et produire des résultats étranges pour les développeurs à l'avenir, exactement comme vous l'avez fait. Si vous ne pouvez pas, choisissez simplement un meilleur nom que Facture-Nouveau :)
Si vous souhaitez des questions plus spécifiques concernant la migration de la base de données de facturation et de tarification, je vous suggère d'ouvrir une question spécifique à cet égard, dans laquelle vous pouvez publier des détails qui pourraient vous aider. Et heureux d'apprendre que vous avez compris quel est le problème.
Ok, merci Arturo pour votre aide!
La meilleure façon de gérer ce type de problème est de lire le message d'erreur très littéralement, et de revenir à la réponse à partir de là: Essayer d'obtenir une propriété d'un non-objet Commençons par regarder pour une propriété dans la ligne de code indiquée où nous apprenons, nous devons nous assurer
$ facture , $ facture-> réservation , $ facture-> booking-> package et $ get_slot tous exister.
Je suis certain que $ facture est nul. Si c'est tout le corps du code du fichier, comme vous le dites dans votre question, alors $ facture n'est jamais défini.
Avant cette ligne:
$ package_custom = PackagesCustomPrices :: where ('package_id', '=', $ facture-> booking-> package-> id) -> where ('slot_id', '=', $ get_slot-> id) -> premier ();
Ajoutez ceci:
jj ($ facture);
et partir de là.
Jeremy, merci pour votre réponse. J'ai ajouté le code complet du fichier à mon message. Pouvez-vous s'il vous plaît conseiller?
La réponse d'Arturo contient de bonnes suggestions, veuillez les essayer. Je l'ai marqué comme correct, bien qu'il ne soit pas complet, il contient de bonnes prochaines étapes pour résoudre votre problème.
Merci je Jeremy j'ai fait ça et commenté son commentaire.
Vous allez probablement devoir ajouter plus de code car il n'est tout simplement pas vraiment possible de vous donner une réponse. Mais il est fort probable que l'un de ces segments ait une valeur nulle: $ facture-> réservation-> package-> id ou $ get_slot-> id
Arturo, Merci pour la réponse. J'ai édité mon message et ajouté plus de code. S'il vous plaît laissez-moi savoir si cela aide.
Salut Jesse, La ligne qui a le problème essaie d'accéder à certaines variables, pour lesquelles au moins une n'a pas de valeur. Tout ce qui se trouve sous (après) la ligne qui a le problème est sans rapport avec le problème lui-même. Avec ce que vous avez publié, ce que je peux voir, c'est que vous essayez de définir une valeur pour $ get_slot. Mais il est possible qu'il ne trouve pas une ligne qui satisfait la requête, donc $ get_slot sera nul et provoquera l'erreur ci-dessous. De plus, nous ne pouvons pas voir d'où vient la valeur de la facture $. Cela pourrait donc aussi être le problème. Veuillez suivre les suggestions ci-dessous en utilisant dd () pour trouver la variable nulle.