Laravel save when update not working (strange behavior) - php

I'm using Laravel 8 and I try to update data, but it won't save, and it really strange.
Controller
private function _generatePaymentToken($kode)
{
$this->initPaymentGateway();
$pnd = new Pendaftar;
$pnd = $pnd::where('nohp', $kode)->get();
if ($pnd->count()) {
$customerDetails = [
'first_name' => $pnd[0]->nama,
'last_name' => $pnd[0]->nama,
'email' => $pnd[0]->email,
'phone' => $pnd[0]->nohp,
];
$params = [
'transaction_details' => [
'order_id' => $pnd[0]->kode_transaksi,
'gross_amount' => 5000,
],
'customer_details' => $customerDetails,
'expiry' => [
'start_time' => date('Y-m-d H:i:s T'),
'unit' => setting('site.unit_expire'),
'duration' => setting('site.time_expired'),
],
];
$snap = \Midtrans\Snap::createTransaction($params);
$pendaftar = Pendaftar::find($pnd[0]->id);
$pendaftar->token = $snap->token;
$pendaftar->save;
// dd($pendaftar->save);
return $snap;
} else {
return view('404');
}
}
Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pendaftar extends Model
{
protected $table = 'pendaftar';
protected $primary_key = 'id';
protected $fillable = ['nama, email, nohp,orangtuawali, alamat, tempat_tanggal_lahir,asal_sekolah, satutahun_regular, satutahun_hybrid,duatahun, sarjana_plus, ihcp, ecp, periode_pendaftaran, created_at, updated_at, deleted_at, kode_refrensi, kode_transaksi,kampus,token'];
}
The $pendaftar->save before return is not working
I try to dd($pendaftar->save) it give me null
and if I dd($pendaftar) it gives me this
App\Pendaftar {#1840
#table: "pendaftar"
#primary_key: "id"
#fillable: array:1 [
0 => "nama, email, nohp,orangtuawali, alamat, tempat_tanggal_lahir,asal_sekolah, satutahun_regular, satutahun_hybrid,duatahun, sarjana_plus, ihcp, ecp, periode_pendaftaran, created_at, updated_at, deleted_at, kode_refrensi, kode_transaksi,kampus,token"
]
#connection: "mysql"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:22 [
"id" => "6"
"nama" => "Putu Elanda"
"email" => "biruxxx#mail.com"
"nohp" => "0878xxx"
"orangtuawali" => "Nyoman Elendiana"
"alamat" => "Singaraja"
"tempat_tanggal_lahir" => "Singaraja / 10 Januari 1996"
"asal_sekolah" => "SMK N 3 Singaraja"
"satutahun_regular" => null
"satutahun_hybrid" => null
"duatahun" => null
"sarjana_plus" => null
"ihcp" => "Profesi 2 Tahun "
"ecp" => "Food Entrepreneurship and Culinary Art"
"periode_pendaftaran" => "Januari"
"created_at" => "2020-12-20 14:15:03"
"updated_at" => "2020-12-20 14:15:03"
"deleted_at" => null
"kode_refrensi" => "BHT08"
"kode_transaksi" => "2012POSA"
"kampus" => null
"token" => "9067715d-aa54-4b10-a457-5445f06df3c4"
]
#original: array:22 [
"id" => "6"
"nama" => "Putu Elanda"
"email" => "biruxxx#mail.com"
"nohp" => "0878xxx"
"orangtuawali" => "Nyoman Elendiana"
"alamat" => "Singaraja"
"tempat_tanggal_lahir" => "Singaraja / 10 Januari 1996"
"asal_sekolah" => "SMK N 3 Singaraja"
"satutahun_regular" => null
"satutahun_hybrid" => null
"duatahun" => null
"sarjana_plus" => null
"ihcp" => "Profesi 2 Tahun "
"ecp" => "Food Entrepreneurship and Culinary Art"
"periode_pendaftaran" => "Januari"
"created_at" => "2020-12-20 14:15:03"
"updated_at" => "2020-12-20 14:15:03"
"deleted_at" => null
"kode_refrensi" => "BHT08"
"kode_transaksi" => "2012POSA"
"kampus" => null
"token" => ""
]
#changes: []
#casts: []
#classCastCache: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [
0 => "*"
]
}
I don't really know what wrong with this, or maybe is there's something I miss?

Your $fillable array is defined incorrectly - each column name should be an element of the array - wrapped in quotes. Otherwise none of the fields would be allowed for mass assignment.
Which means even if the update or save methods will not throw error - data won't be saved to database for these columns.
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pendaftar extends Model
{
protected $table = 'pendaftar';
protected $primary_key = 'id';
protected $fillable = [
'nama',
'email',
'nohp',
'orangtuawali',
'alamat',
'tempat_tanggal_lahir',
'asal_sekolah',
'satutahun_regular',
'satutahun_hybrid',
'duatahun',
'sarjana_plus',
'ihcp',
'ecp',
'periode_pendaftaran',
'created_at',
'updated_at',
'deleted_at',
'kode_refrensi',
'kode_transaksi',
'kampus,token'
];
}
And as #bhucho has pointed out save() is a method not property, so statement should be
$pendaftar->save();

Related

Call to a member function toArray() on array -Laravel

// $result=[];
foreach ($chapter['chapter_content'] as $row) {
$result = CoursePublishChaptercontent::create([
'courseId' => $postdata[$i]['courseId'],
'course_chapter_id' => $postdata[$i]['course_chapter_id'],
'file_id' => $postdata[$i]['file_id'],
'course_chapter_content_id' => $postdata[$i]['course_chapter_content_id'],
]);
}
dd($result->toArray());
dd($result) shows the below data. I cannot call $result->toArray(); outside the foreach - it shows the error Undefined variable: result. When declaring $result before foreach as $result=[];, it shows the error Call to a member function toArray() on array. How can i fix it?Can someone tell me how to achieve this? I also tried declaring $result as '' & null before foreach. Both shows errors Call to a member function toArray() on string & Call to a member function toArray() on null respectively.
App\Models\CoursePublishChaptercontent {#441
#table: "course_publish_chapter_contents"
#fillable: array:9 [
0 => "course_chapter_id"
1 => "file_id"
2 => "courseId"
3 => "course_chapter_content_id"
]
#connection: "pgsql"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
+preventsLazyLoading: false
#perPage: 15
+exists: true
+wasRecentlyCreated: true
#attributes: array:12 [
"courseId" => 1
"course_chapter_id" => 18
"content_type_id" => 1
"file_id" => null
"course_chapter_content_id" => 17
"id" => 106
]
#original: array:12 [
"courseId" => 1
"course_chapter_id" => 18
"content_type_id" => 1
"course_chapter_content_id" => 17
"content_description" => null
"id" => 106
]
#changes: []
#casts: array:1 [
"deleted_at" => "datetime"
]
#classCastCache: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [
0 => "*"
]
#forceDeleting: false
#enableLoggingModelsEvents: true
#oldAttributes: []
}
You are on the right track. You can use the collect() helper to convert the result array into a collection and than you can use the toArray() method.
This is one way to do it:
$result = [];
foreach ($chapter['chapter_content'] as $row) {
$result[] = CoursePublishChaptercontent::create([
'courseId' => $postdata[$i]['courseId'],
'course_chapter_id' => $postdata[$i]['course_chapter_id'],
'file_id' => $postdata[$i]['file_id'],
'course_chapter_content_id' => $postdata[$i]['course_chapter_content_id'],
]);
}
dd(collect($result)->toArray());

Laravel 5.8: Parameter passed to the event listener is getting null

I have created an Event called UserWalletNewTransaction.php and added this to it:
public $transaction;
public function __construct($transaction) {
$this->$transaction = $transaction;
}
And also registered it at EventServiceProivder.php:
use App\Listeners\UserWalletNotification;
protected $listen = [
UserWalletNewTransaction::class => [
UserWalletNotification::class,
],
Now in order to fire this event at the Controller, I coded this:
$newTransaction = UserWalletTransaction::create(['user_id' => $user_id, 'wallet_id' => $wallet_id, 'creator_id' => $creator_id, 'amount' => $amount_add_value, 'description' => $trans_desc]);
event(new UserWalletNewTransaction($newTransaction));
Then at the Listener, UserWalletNotification.php, I tried:
public function handle(UserWalletNewTransaction $event) {
dd($event->transaction);
}
But it returns null somehow.
However if I dd($event) instead, I get this:
So what is going wrong here? I can properly insert new record at user_wallet_transactions and the variable $newTransaction should contain the transaction information but it's not.
Here is also the Model UserWalletTransaction.php:
protected $fillable = ['user_id','wallet_id','amount','description','creator_id'];
protected $table = 'user_wallet_transactions';
I would really appreciate any idea or suggestion from you guys about this...
Thanks in advance.
UPDATE #1:
If I do dd($newTransaction) at the Controller before event(), I get this:
UPDATE #2:
Here is the full code of event, UserWalletNewTransaction.php:
class UserWalletNewTransaction
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* #return void
*/
public $transaction;
public function __construct($transaction)
{
$this->$transaction = $transaction;
}
}
UPDATE #3:
Here is the full result of dd($event) at the Listener:
App\Events\UserWalletNewTransaction {#2533 ▼
+newTransaction: null
+socket: null
+"{"user_id":"373","wallet_id":"2","creator_id":2,"amount":"-60","description":null,"updated_at":"2021-07-18 13:33:59","created_at":"2021-07-18 13:33:59","id":61}": App\UserWalletTransaction {#2535 ▼
#fillable: array:5 [▼
0 => "user_id"
1 => "wallet_id"
2 => "amount"
3 => "description"
4 => "creator_id"
]
#table: "user_wallet_transactions"
#connection: "mysql"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: true
#attributes: array:8 [▼
"user_id" => "373"
"wallet_id" => "2"
"creator_id" => 2
"amount" => "-60"
"description" => null
"updated_at" => "2021-07-18 13:33:59"
"created_at" => "2021-07-18 13:33:59"
"id" => 61
]
#original: array:8 [▼
"user_id" => "373"
"wallet_id" => "2"
"creator_id" => 2
"amount" => "-60"
"description" => null
"updated_at" => "2021-07-18 13:33:59"
"created_at" => "2021-07-18 13:33:59"
"id" => 61
]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [▼
0 => "*"
]
}
}
I just figured out the problem... You are doing $this->$transaction when it should be $this->transaction.
I also had this problem, in case it is the case: remove the underscores in the properties of the event. ($_order has to be $order)

Laravel 8 ErrorException: Trying to access array offset on value of type null

I'm working with Laravel to develop my project and basically I want to edit some Articles from database at my theme, so I created a blade called edit.blade.php and in this blade, there's a row that gets the current image of an Article:
<div class="row">
#foreach($article->images['images'] as $key => $image)
<div class="col-sm-2">
<label class="control-label">
{{$key}}
<input type="radio" name="imagesThumb" value="{{ $image }}" {{ $article->images['thumb'] ? 'checked' : '' }} />
<img src="{{$image}}" width="100%">
</label>
</div>
#endforeach
</div>
And the Article model also goes like this:
class Article extends Model
{
use HasFactory;
use Sluggable;
protected $guarded = [];
protected $casts = [
'images' => 'array'
];
public function sluggable()
{
return [
'slug' => [
'source' => 'title'
]
];
}
public function path()
{
return "/article/$this->slug";
}
}
And here is the ArticleController edit method which calls the blade:
public function edit(Article $article)
{
return view('website.backend.articles.edit',compact('article'));
}
Now the problem with this is that, whenever I want to go to this blade, it returns this error:
ErrorException Trying to access array offset on value of type null
(View: edit.blade.php)
And it is referring to this line of blade:
#foreach($article->images['images'] as $key => $image)
So I don't know why it shows me this error, if you know please let me know, I would really appreciate any idea from you guys...
Thanks in advance.
UPDATE #2:
Here is my store method of ArticleController:
public function store(ArticleRequest $request)
{
//auth()->loginUsingId(1);
$imageUrl = $this->uploadImages($request->file('images'));
auth()->user()->article()->create(array_merge(['images' => $imageUrl], $request->all()));
return redirect(route('articles.index'));
}
And here is the AdminController that comes with the UploadImages method and is extended by ArticleController:
class AdminController extends Controller
{
protected function uploadImages($file)
{
$year = Carbon::now()->year;
$imagePath = "/upload/images/{$year}/";
$filename = $file->getClientOriginalName();
$file = $file->move(public_path($imagePath), $filename);
$sizes = ["300","600","900"];
$url['images'] = $this->resize($file->getRealPath(), $sizes, $imagePath, $filename);
$url['thumb'] = $url['images'][$sizes[0]];
return $url;
}
private function resize($path, $sizes, $imagePath, $filename)
{
$images['original'] = $imagePath . $filename;
foreach($sizes as $size)
{
$images[$size] = $imagePath . "{$size}" . $filename;
Image::make($path)->resize($size, null, function($constraint){
$constraint->aspectRatio();
})->save(public_path($images[$size]));
}
return $images;
}
}
UPDATE #1:
Output of dd($article); is:
App\Models\Article {#1234 ▼
#guarded: []
#casts: array:1 [▼
"images" => "array"
]
#connection: "mysql"
#table: "articles"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:12 [▼
"id" => 2
"user_id" => 1
"title" => "asdasd"
"slug" => "asdasd"
"description" => "asdsadas"
"body" => "asdsada"
"images" => "F:\xampp\tmp\php1825.tmp"
"tags" => "asdsad"
"viewCount" => 0
"commentCount" => 0
"created_at" => "2020-11-09 12:24:33"
"updated_at" => "2020-11-09 12:24:33"
]
#original: array:12 [▼
"id" => 2
"user_id" => 1
"title" => "asdasd"
"slug" => "asdasd"
"description" => "asdsadas"
"body" => "asdsada"
"images" => "F:\xampp\tmp\php1825.tmp"
"tags" => "asdsad"
"viewCount" => 0
"commentCount" => 0
"created_at" => "2020-11-09 12:24:33"
"updated_at" => "2020-11-09 12:24:33"
]
#changes: []
#classCastCache: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
}
It's because of this line:
auth()->user()->article()->create(array_merge(['images' => $imageUrl], $request->all()));
$request->all() contains a key images which is set to the temp path (F:\xampp\tmp\php1825.tmp) and in array_merge, values in later params override ones from earlier params. To fix it just swap the params like this:
auth()->user()->article()->create(array_merge($request->all(), ['images' => $imageUrl]));

->toArray() is giving empty arrays instead of objects

I have a chunked array of 1000 Raw Objects:
class Raw extends Model
{
protected $table = 'raws';
protected $casts = [
'time' => 'datetime'
];
public $timestamps = [
"time"
];
private string $operationId;
private string $meterId;
private string $consoProd;
private string $timestep;
private string $unit;
private string $timestamp;
private string $value;
}
collect($measures)->chunk(1000)->each(function ($raws) use ($meter) {
$raws = $raws->map(function ($raw) use ($meter) {
return new \App\Models\Raw($meter['OperationID'], $meter['ID'], $meter['ConsoProd'], $meter['Timestep'], $meter['Unit'], $raw['t'], $raw['d']);
})->toArray();
dd($raws);
});
When I don't use ->toArray(), I can see a collection of 1000 Raw elements:
Illuminate\Support\Collection {#2857 ▼
#items: array:1000 [▼
0 => App\Models\Raw {#1857 ▼
#table: "raws"
#casts: array:1 [ …1]
+timestamps: array:1 [ …1]
-operationId: "ACC00000001"
-meterId: "30002431650000"
-consoProd: "Conso"
-timestep: "600000000000"
-unit: "kW"
-timestamp: "2018-09-11T00:00:00+02:00"
-value: "7"
#connection: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#attributes: []
#original: []
#changes: []
#classCastCache: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [ …1]
}
1 => App\Models\Raw {#1858 ▶}
2 => App\Models\Raw {#1859 ▶}
3 => App\Models\Raw {#1860 ▶}
But I try to convert it into an array with:
dd($raws->toArray());
I get:
array:1000 [
0 => []
1 => []
2 => []
3 => []
4 => []
5 => []
6 => []
7 => []
8 => []
9 => []...
Why ???
As you can see in Model.php, in it's constructor it accepts an array of attributes and not multiple parameters. So you need to do the creation of Raw.php model like so.
$raws = $raws->map(function ($raw) use ($meter) {
return new \App\Models\Raw([
'operationId' => $meter['OperationID'],
'meterId' => $meter['ID'],
'consoProd' => $meter['ConsoProd'],
'timestep' => $meter['Timestep'],
'unit' => $meter['Unit'],
'timestamp' => $meter['t'],
'value' => $meter['d'],
]);
})->toArray();
It was a little hard to assume your database columns, the keys in the array, has to be the column name of the database so please check it.

Transform eloquent model using fractal

I am trying to use fractal to convert dates in my eloquent model when sending it to a web page via ajax. However, I'm not getting the expected transformed data object. Here's my code:
Transformer:
<?php
namespace App\Transformers\Models;
use App\Models\Student;
use League\Fractal;
class StudentTransformer extends Fractal\TransformerAbstract
{
public function transform(Student $student)
{
return [
'name' => $student->name,
'birth_date' => date('d-m-Y', strtotime($student->birth_date)),
'start_date' => date('d-m-Y', strtotime($student->start_date)),
'is_active' => $student->is_active ? 'Yes' : 'No',
'course_title' => $student->course_title,
'university_id' => $student->university_id,
'institution_id' => $student->institution_id,
'course_id' => $student->course_id,
];
}
}
Routes file:
Route::get('/', function () {
$student = App\Models\Student::first();
$response = new League\Fractal\Resource\Item($student, new App\Transformers\Models\StudentTransformer);
return response()->json([$response]);
});
returns this:
[
{ }
]
if I dd(), like so:
Route::get('/', function () {
$student = App\Models\Student::first();
$response = new League\Fractal\Resource\Item($student, new App\Transformers\Models\StudentTransformer);
dd($response);
});
I get the following, with no apparent transformations made
Item {#299 ▼
#data: Student {#305 ▼
#fillable: array:10 [▼
0 => "name"
1 => "birth_date"
2 => "start_date"
3 => "is_active"
4 => "course_title"
5 => "university_id"
6 => "institution_id"
7 => "course_id"
]
#connection: null
#table: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:13 [▼
"id" => 1
"name" => "Michel Jast"
"birth_date" => "1979-12-22"
"start_date" => "2015-08-02"
"is_active" => 1
"course_title" => "quia"
"university_id" => "10954"
"institution_id" => 1044
"course_id" => 1
"created_at" => "2015-11-23 09:40:35"
"updated_at" => "2015-11-26 10:24:14"
]
#original: array:13 [▼
"id" => 1
"name" => "Michel Jast"
"birth_date" => "1979-12-22"
"start_date" => "2015-08-02"
"is_active" => 1
"course_title" => "quia"
"university_id" => "10954"
"institution_id" => 1044
"course_id" => 1
"created_at" => "2015-11-23 09:40:35"
"updated_at" => "2015-11-26 10:24:14"
]
#relations: []
#hidden: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
}
#meta: []
#resourceKey: null
#transformer: StudentTransformer {#301 ▼
#availableIncludes: []
#defaultIncludes: []
#currentScope: null
}
}
Any ideas what I'm missing here?
My implementation is the following :
Route::get('/', function () {
$student = App\Models\Student::first();
$response = new League\Fractal\Resource\Item($student, new App\Transformers\Models\StudentTransformer);
$manager = new \League\Fractal\Manager();
$manager->setSerializer(new \League\Fractal\Serializer\ArraySerializer());
return response()->json($manager->createData($response)->toArray());
});
You have to create a \League\Fractal\Manager instance and assign a serializer into it. The manager will return the data into array or others.
In fractal page, there is more detail.
Ive not used Factral in a project but I think you need to do something like.
Route::get('/', function () {
$student = App\Models\Student::first();
$response = new League\Fractal\Resource\Item($student, new App\Transformers\Models\StudentTransformer);
return response()->json($response->toArray());
});

Categories