Attempt to read property "ref_department_id" on null in laravel 8 - laravel

My problem is its hard to get the data from relationship field. There is no null value in table but the error shows attempt to read null value.The data connected with api.Its work when i put if and else but i cant figure out the correct solution for this problem.
Here is my function.php line
function getUnitClerk($unit_id){
$unit = Unit::where('id', $unit_id)->first();
$division = Division::where('id', $unit->ref_division_id)->first();
$department = Department::where('id', $division->ref_department_id)->first();
}
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Platform\Bpms;
use Session;
use Illuminate\Support\Facades\DB;
use App\User;
class AdminController extends Controller
{
public function __construct()
{
$this->middleware('guest');
}
public function dashboard()
{
if(!auth()->check())
{
return redirect('login')->with('message', 'Please log in!');
}else{
$roleOfUser = DB::table('role_of_user')->where('user_id','=',auth()->user()->id)->get();
$tasklist = Bpms::queryForTaskListByAssignee(auth()->user()->id);
$list_role = '';
if(count($roleOfUser) > 0){
foreach($roleOfUser AS $roleUser){
if($roleUser != ''){
$grouptasklist = Bpms::queryForTaskList($roleUser->role_name);
$tasklist = array_merge($tasklist, $grouptasklist);
$list_role .= $roleUser->role_name;
$list_role .= ",";
}else{
$tasklist = array();
}
}
}
if(count($tasklist) > 0){
foreach ($tasklist as $i => $task) {
$taskname = $task['taskDefinitionKey'];
$overdue = 'overdue';
if((stripos($taskname, $overdue) !== FALSE)){
$overdue_task2[] = 1;
}else{
$overdue_task2[] = 0;
}
}
$overdue_task = array_sum($overdue_task2);
}else{
$overdue_task = 0;
}
$new = DB::table('history')->where('history_status', '=', 2)->where('history_sender_id','=',auth()->user()->id)->get();
$newtask = count($new);
$inprogress = count($tasklist);
$closed = DB::table('history')
->whereRaw('(history_status = 6)')
->where('created_by','=',auth()->user()->id)
->get();
$closedtask = count($closed);
$lastlogin = DB::table('audit_trail')
->where('adt_action_name', '=', 1)
->where('adt_created_by','=',auth()->user()->id)
->orderBy('adt_created_date', 'desc')
->skip(1)
->take(1)
->first();
// echo '<pre>';
// print_r($tasklist);
// $historyCheck = DB::table('history')->where('history_taskid','=',88989)->exists();
// if($historyCheck)
// {
// $history = DB::table('history')->where('history_taskid','=',88989)->first();
// print_r($history);
// $recordrequest = DB::table('ddms_record_request')->where('ddms_request_id','=',$history->history_request_id)->first();
// print_r($recordrequest);
// exit;
// $requestnumber = DB::table('ddms_request')->where('id','=',$recordrequest->ddms_request_id)->first();
// } else {
// $history = array();
// $recordrequest = array();
// $requestnumber = array();
// }
return view('main.dashboard',compact('tasklist','newtask','inprogress','closedtask', 'overdue_task', 'lastlogin'));
}
}
}
?>
unit model
namespace App\Models\References;
use Illuminate\Database\Eloquent\Model;
class Unit extends Model
{
protected $table = 'ref_unit';
public function division() {
return $this->belongsTo(division::class,'ref_division_id','id');
}
public function section() {
return $this->hasMany(section::class,'ref_unit_id','id');
}
}
Division Model
namespace App\Models\References;
use Illuminate\Database\Eloquent\Model;
class Division extends Model
{
protected $table = 'ref_division';
public function department() {
return $this->belongsTo(department::class,'ref_department_id','id');
}
public function unit() {
return $this->hasMany(unit::class,'ref_division_id','id');
}
}
Department Model
namespace App\Models\References;
use Illuminate\Database\Eloquent\Model;
class Department extends Model
{
protected $table = 'ref_department';
public function tenant() {
return $this->belongsTo('App\Models\References\Tenant','ref_tenant_id','id');
}
public function departmentdetail() {
return $this->hasMany(departmentdetail::class,'ref_department_id','id');
}
public function division() {
return $this->hasMany(division::class,'ref_department_id','id');
}}

Related

Laravel export Maatwebsite/Excel, restructuring the output

Could somebody tell me how to reformat the excel output, so that i get two excel columns. Right now it gives me two arrays in A1 and B1. like two fields with [1,24,5,3.3] and [3,4,5,6], but I want two columns with the numbers.
Route
Route::get('/exporttable/{id}', [TableExportController::class, 'export']);
TableExportController
use Illuminate\Http\Request;
use App\Exports\TablesExport;
use Maatwebsite\Excel\Facades\Excel;
class TableExportController extends Controller
{
public function export(Request $request){
return Excel::download(new TablesExport($request->id), 'tables.xlsx');
}
}
TableExport.php
use App\Models\Tabula;
use Maatwebsite\Excel\Concerns\FromCollection;
class TablesExport implements FromCollection
{
/**
* #return \Illuminate\Support\Collection
*/
function __construct($id) {
$this->id = $id;
}
public function collection()
{
$tabula = Tabula::select('soll', 'haben')->where('id', '=', $this->id)->get();
return $tabula;
}
}
It works with the code of Natvarsinh Parmar - bapu , if you edit the map-function like this
public function map($tabula): array
{
//unformatieren
$soll = $tabula->soll;
//vom string Randwerte abschneiden: [ und ]
$soll = substr($soll, 1, -1);
// in Array umwandeln
$soll = explode( ',', $soll);
//das gleiche mit soll
$haben = $tabula->haben;
$haben = substr($haben, 1, -1);
$haben = explode( ',', $haben);
// als ersten Wert den Header soll/haben einfügen ins Array
array_unshift($haben, "haben");
array_unshift($soll, "soll");
return [
$soll,
$haben
];
}
So now it works, thanks! Each array covers a row in excel now.
Make changes as per below in TableExport.php and check
<?php
namespace App\Exports;
use App\Models\Tabula;
use Maatwebsite\Excel\Concerns\FromArray;
class TablesExport implements FromArray
{
protected $soll;
protected $haben;
protected $export_data;
public function __construct($id)
{
$this->id = $id;
}
public function array(): array
{
$results = Tabula::select('id', 'soll', 'haben')
->where('id', $this->id)
->get();
$this->export_data = [];
$results->each(function($result) {
preg_match_all('!\d+!', $result->soll, $matches_soll);
preg_match_all('!\d+!', $result->haben, $matches_haben);
$this->soll = [];
$this->haben = [];
if(isset($matches_soll[0]))
{
$this->soll = collect($matches_soll[0]);
}
if(isset($matches_haben[0]))
{
$this->haben = collect($matches_haben[0]);
}
if(count($this->soll) > count($this->haben)) {
foreach($this->soll as $key => $val){
$temp = [];
$temp = [
$val,
(isset($this->haben[$key])) ? $this->haben[$key] : ''
];
$this->export_data[] = $temp;
}
} else {
foreach($this->haben as $key => $val){
$temp = [];
$temp = [
(isset($this->soll[$key])) ? $this->soll[$key] : '',
$val
];
$this->export_data[] = $temp;
}
}
});
return $this->export_data;
}
}

Laravel 6 pathinfo() expects parameter 1 to be string, object given

This is where i get the error:
$data = Excel::import($path, function($reader) {})->get();
I changed the load() to import(). I want to run this code in Laravel 6, but version 3 of MaatWebsiteExcel does not support load().
I've been searching for solutions, yet i cant find any....
This is my controller:
namespace App\Http\Controllers;
use App\Contact;
use App\CsvData;
use App\Http\Requests\CsvImportRequest;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Session;
use DB;
class ImportController extends Controller
{
public function getImport()
{
return view('import');
}
function parseImport(CsvImportRequest $request)
{
$path = $request->file('csv_file')->getRealPath();
if ($request->has('header')) {
$data = Excel::import($path, function($reader) {})->get();
} else {
$data = array_map('str_getcsv', file($path));
}
if (count($data) > 0) {
if ($request->has('header')) {
$csv_header_fields = [];
foreach ($data[0] as $key => $value) {
$csv_header_fields[] = $key;
}
}
$csv_data = array_slice($data, 0, 2);
$credentials = $request->file('csv_file')->getClientOriginalName();
$filename = CsvData::all('csv_filename');
if(CsvData::where('csv_filename', '=' ,$credentials)->exists()){
return redirect()->back()->with('alert', 'This specific file has already been imported!');
}
else{
$csv_data_file = CsvData::create([
'csv_filename' => $request->file('csv_file')->getClientOriginalName(),
'csv_header' => $request->has('header'),
'csv_data' => json_encode($data)
]);
}
}
else {
return redirect()->back();
}
return view('import_fields', compact( 'csv_header_fields', 'csv_data', 'csv_data_file'));
}
public function processImport(Request $request)
{
$data = CsvData::find($request->csv_data_file_id);
$csv_data = json_decode($data->csv_data, true);
if(CsvData::where('csv_data', '=' ,$csv_data)->exists()){
return redirect()->back()->with('alert', 'This file has already been imported!');
}
else{
foreach ($csv_data as $row) {
$contact = new Contact();
foreach (config('app.db_fields') as $index => $field) {
if ($data->csv_header) {
$contact->$field = $row[$request->fields[$field]];
} else {
$contact->$field = $row[$request->fields[$index]];
}
}
foreach($contact as $contacts){
$contact->posted_by = $contacts->posted_by;
$contact->employer = $contacts->employer;
$contact->address = $contacts->address;
$contact->barangay = $contacts->barangay;
$contact->citymunicipality = $contacts->citymunicipality;
$contact->province = $contacts->province;
$contact->region = $contacts->region;
$contact->position = $contacts->position;
$contact->job_description = $contacts->job_description;
$contact->salary = $contacts->salary;
$contact->count = $contacts->count;
$contact->work_location = $contacts->work_location;
$contact->nature_of_work = $contacts->nature_of_work;
$contact->min_work_exp_mos = $contacts->min_work_exp_mos;
$contact->min_educ_level = $contacts->min_educ_level;
$contact->coursemajor = $contacts->coursemajor;
$contact->min_age = $contacts->min_age;
$contact->max_age = $contacts->max_age;
$contact->min_height = $contacts->min_height;
$contact->sex = $contacts->sex;
$contact->civil_status = $contacts->civil_status;
$contact->other_qualifications = $contacts->other_qualifications;
$contact->remarks = $contacts->remarks;
$contact->accept_disability = $contacts->accept_disability;
$contact->date_posted = $contacts->date_posted['date'];
$contact->valid_until = $contacts->valid_until['date'];
$contact->date_created = $contacts->date_created['date'];
$contact->last_modified_by = $contacts->last_modified_by['date'];
$contact->date_last_modified = $contacts->date_last_modified['date'];
}
$contact->save();
return view('import_success');
}
}
}
}```
The first parameter of the import() method is not the path to the file anymore in Laravel 3.1, but the class name of the Import file you have to create.
You need to follow below steps to use import method
Step1: Create Import File using below command.
php artisan make:import CsvImport
Step2: Inside CsvImport make changes like this:
namespace App\Imports;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class CsvImport implements ToCollection
{
public function collection(Collection $rows)
{
return $rows; //add this line
}
}
Step3: In Controller make changes like this:
$path = $request->file('csv_file')->getRealPath();
$rows = Excel::import(new CsvImport, $path);
Reference:
https://docs.laravel-excel.com/3.1/imports/basics.html
I need only those columns after specific indexing, which I consider practically the same use case as described in the question at the top of this page. I propose the following as solution.
$fileArr = (new BulkSampleImport)->toArray($request->file);

Laravel method in getCustomAttribute returning cullection null

I am trying to modify $category->slug by getSlugAttribute(). My Category class like this,
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;
class Category extends Model
{
public function getSlugAttribute(){
return $this->getRoute($this);
}
//Testing _____________________________________________________
private $routes = [];
public function getRoute(Category $category)
{
$this->determineCategoriesRoutes();
return $this->routes[$category->id];
}
private function determineCategoriesRoutes()
{
$categories = $this->all()->keyBy('id');
foreach ($categories as $id => $category) {
$slugs = $this->determineCategorySlugs($category, $categories);
if (count($slugs) === 1) {
$this->routes[$id] = '/' . $slugs[0];
}
else {
$this->routes[$id] = '/' . implode('/', $slugs);
}
}
}
private function determineCategorySlugs(Category $category, Collection $categories, array $slugs = [])
{
array_unshift($slugs, $category->slug);
if ($category->parent_id != 0) {
$slugs = $this->determineCategorySlugs($categories[$category->parent_id], $categories, $slugs);
}
return $slugs;
}
//End Testing__________________________________________________
//end of this class
}
Now when I request for categories it's just loading and giving me a blank page.
Route::get('/test', function(App\Category $category){
$categories = $category->all();
return $categories;
});
This is my test route, also there is no error.

Inserting Data in Pivot Table

The two tables tbl_product_manager and tbl_tags with many to many relations. I used eloquent to to make a relations between the corresponding models. I am able to to insert the data in these two table but the problem is the pivot table is not updated correspondingly.
Controller.php:
public function addProduct()
{
$rules = array('product_name' => 'required',
'product_url' => 'required');
$validator = Validator::make(Input::all(), $rules);
if($validator->fails()){
Session::flash('class', 'alert alert-error');
Session::flash('message', 'Some fields are missing');
return View::make('admin.product.add');
}
else {
$productName = Input::get('product_name');
$productUrl = Input::get('product_url');
$productUrl = preg_replace('/[^A-Za-z0-9\-]/', '', $productUrl);
$productExist = ProductManagementModel::checkExist($productUrl);
if( count($productExist)!=0) {
$message = 'product <b>'.$productName.'</b> with url <b>'.$productUrl.'</b> is already exist';
Session::flash('class', 'alert alert-error');
Session::flash('message', $message);
return View::make('admin.product.add');
}
else {
$imageFile = Input::file('userfile');
$destinationPath = 'uploads/products/';
$rEFileTypes = "/^\.(jpg|jpeg|gif|png){1}$/i";
$maximum_filesize = 1 * 1024 * 1024;
if($imageFile) {
$filename = $imageFile->getClientOriginalName();
$extension = strrchr($filename, '.');
$size = $imageFile->getSize();
$new_image_name = "products" . "_" . time();
if ($size <= $maximum_filesize && preg_match($rEFileTypes, $extension)) {
$attachment = $imageFile->move($destinationPath, $new_image_name.$extension);
} else if (preg_match($rEFileTypes, $extension) == false) {
Session::flash('class', 'alert alert-error');
Session::flash('message', 'Warning : Invalid Image File!');
return View::make('admin.product_management.add');
} else if ($size > $maximum_filesize) {
Session::flash('class', 'alert alert-error');
Session::flash('message', "Warning : The size of the image shouldn't be more than 1MB!");
return View::make('admin.product_management.add');
}
}
$logo = isset($attachment) ? $new_image_name . $extension : NULL;
$objectProduct = new ProductManagementModel;
$objectProduct->product_name = Input::get('product_name');
$objectProduct->product_url = $productUrl;
$objectProduct->category_id = Input::get('category_id');
$objectProduct->product_cost = Input::get('product_cost');
$objectProduct->product_short_description = Input::get('product_short_description');
$objectProduct->product_description = Input::get('product_description');
$objectProduct->is_active = Input::get('is_active');
$objectProduct->created_at = Auth::user()->id;
$objectProduct->updated_at = Auth::user()->id;
if($logo != '')
{
$objectProduct->product_attachment = $logo;
}
$objectTags = new TagModel;
$objectTags->size_id = Input::get('size_id');
$objectTags->brand_id = Input::get('brand_id');
$objectTags->color_id = Input::get('color_id');
$objectTags->food_id = Input::get('food_id');
$objectTags->save();
//$tag = new TagModel::all();
$objectProduct->save();
if(isset($request->tags)) {
$post->Tags()->sync($request->tags, false);
}
if($objectProduct->id) {
Session::flash('class', 'alert alert-success');
Session::flash('message', 'Product successfully added');
return View::make('admin.product_management.add');
} else {
Session::flash('class', 'alert alert-error');
Session::flash('message', 'Something error');
return View::make('admin.product_management.add');
}
}
}
}
ProductManagementModel.php
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class ProductManagementModel extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
protected $table = 'product_manager';
public function Tags(){
return $this->belongsToMany('TagModel', 'product_tag', 'product_id', 'tag_id');
}
public function Categories(){
return $this->hasOne('CategoriesModel', 'id');
}
public static function getAllProducts(){
return $products = ProductManagementModel::with('categories','tags')->get();
}
public static function checkExist($url)
{
return $products = DB::table('product_manager')
->where('is_deleted', 0)
->where('product_url', $url)
->first();
}
}
TagModel.php
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class TagModel extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
protected $table = 'tag';
public function ProductManagents() {
return $this->belongsToMany('ProductManagentModel');
}
public function Color(){
return $this->hasOne('ColorModel', 'color_id');
}
public function Brand() {
return $this->hasOne('BrandproModel','brand_id');
}
public function size() {
return $this->hasOne('SizeModel','size_id');
}
public function food() {
return $this->hasOne('FoodModel','food_id');
}
}
During my research i found that using sync function will be appropriate to updated the pivot table. But I failed to use it.
I am expecting to resolve this problem or something new way to find out the solution.
Thanks in advance.
Look at attach, detach or synch method :
https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships
Note it's more easily if you respect the eloquent naming convention
http://www.rappasoft.com/articles/laravel-eloquent-naming-convention-guide/

Laravel - Prevent from create empty key in database

I have a table where I keep all the settings that will be used on the website, they are saved in the cache, I'm trying to upload the favicon, however when uploading the image the favicon row is updated and an empty key value with the temp path is created at the same time, how can I solve this?
You can see the empty field in the image...
Route
Route::put('/', ['as' => 'setting.update', 'uses' => 'Admin\AdminConfiguracoesController#update']);
Model
class Setting extends Model
{
protected $table = 'settings';
public $timestamps = false;
protected $fillable = ['value'];
}
Controller
class AdminConfiguracoesController extends AdminBaseController
{
private $repository;
public function __construct(SettingRepository $repository){
parent::__construct();
$this->repository = $repository;
}
public function update(Request $request, Factory $cache)
{
$settings = $request->except('_method', '_token');
$this->repository->update($settings);
$cache->forget('settings');
return redirect()->back();
}
}
Repository
class SettingRepository{
private $settings;
public function __construct(Setting $settings)
{
$this->settings = $settings;
}
public function update($key, $value = null)
{
if (is_array($key))
{
foreach ($key as $name => $value)
{
if( $name == "website_favicon" ){
$imageName = $key['website_favicon']->getClientOriginalName();
$this->update($name, asset('public/images/website/'.$imageName));
$key['website_favicon']->move(
base_path() . '/public/images/website/', $imageName
);
} else{
$this->update($name, $value);
}
}
}
$setting = $this->settings->firstOrCreate(['name' => $key]);
$setting->value = $value;
$setting->save();
}
public function lists()
{
return $this->settings->lists('value', 'name')->all();
}
}
The problem is a missing return statement after the foreach loop in your repository. The code after the loop will be executed. $key is an array and $value is the temp value of the uploaded file, which will be set inside the loop.
As I mentioned in my comment, you shouldn't use the repository to upload files. Do it in your controller instead:
AdminConfiguracoesController.php
class AdminConfiguracoesController extends AdminBaseController
{
private $repository;
public function __construct(SettingRepository $repository)
{
parent::__construct();
$this->repository = $repository;
}
public function update(Request $request, Factory $cache)
{
$settings = $request->except('_method', '_token', 'website_favicon');
if ($request->hasFile('website_favicon'))
{
$this->uploadImage($request->file('website_favicon'), 'website_favicon');
$cache->forget('website_favicon');
}
$this->repository->update($settings);
$cache->forget('settings');
return redirect()->back();
}
private function uploadImage(UploadedFile $image, $key)
{
$image->move(public_path('images/website'), $image->getClientOriginalName());
$this->repository->update($key, $image->getClientOriginalName());
}
}
SettingRepository.php
class SettingRepository
{
private $settings;
public function __construct(Setting $settings)
{
$this->settings = $settings;
}
public function update($key, $value = null)
{
if (is_array($key))
{
foreach ($key as $name => $value)
{
$this->update($name, $value);
}
return; // This was missing!
}
$setting = $this->settings->firstOrCreate(['name' => $key]);
$setting->value = $value;
$setting->save();
}
public function lists()
{
return $this->settings->lists('value', 'name')->all();
}
}
You can refactor this even further to use a Job that uploads the image, but this would be overkill for now.

Resources