Cannot access property/attribute of returned record
Closed this issue · 2 comments
Describe the bug
Cannot access property 'target' of returned record.
TestController:
class TestController
{
public function index(Request $request)
{
/** @var DynamoDBRedirect $redir */
$redir = DynamoDBRedirect::where(['source' => 'foo'])->first();
dd($redir->target);
// Code used to create the record (OK)
// $model = new DynamoDBRedirect([
// 'source' => 'foo',
// 'target' => 'bar',
// ]);
//
// $model->save();
}
}
DynamoDBRedirect.php:
<?php
namespace App\Models;
use BaoPham\DynamoDb\DynamoDbModel;
class DynamoDBRedirect extends DynamoDbModel
{
public $table = 'redirects';
public $primaryKey = 'source';
public $source;
public $target;
protected $fillable = [
'source',
'target'
];
protected $guarded = [];
}
Result on test controller output:
Result with dd($redir):
('target' is in 'attributes' array - but can't be accessed with $redir->target ?):
Schema
table=redirects
Item exists in DDB, call from CLI:
aws dynamodb get-item --consistent-read
--table-name redirects
--key '{ "source": {"S": "foo"}}'
--endpoint-url=http://localhost:8000
Response:
{
"Item": {
"created_at": {
"S": "2024-01-09T14:23:01+00:00"
},
"source": {
"S": "foo"
},
"updated_at": {
"S": "2024-01-09T14:23:01+00:00"
},
"target": {
"S": "bar"
}
}
}
Describe your table schema:
-
Primary key / composite key
PK=source -
Any index?
None
Debug info
Version info
- Laravel: 10.x
- laravel-dynamodb: latest
Maybe I am not "finding" the record correctly?
How are attributes accessed on a given record/object?
Why does it use $model->find() rather than MyModel::find() ?
I can't see a find() method anywhere in DynamoDbModel? So if my class extends that class, how does $model->find() work?
Assuming that MyModel extends DynamoDbModel.
Finding the docs quite unclear on this ... (sample of good docs).
Yes, you can use the static find()
normally in your model. DynamoDbModel
inherits all methods from Model
, just adjusting the required ones to work with Dynamo DB.
@gvanto You have some problems in your model definition:
- You MUST NOT add your database attributes as model properties. That will prevent them to be hydrated as attributes when fetched from the database; remove them.
- You are using
$fillable
and$guarded
together. It is not recommended to use$fillable
and$guarded
together because they have opposite effects;$fillable
allows only the specified attributes to be mass assigned, while$guarded
blocks only the specified attributes from being mass assigned.
As recommendation, you can use a sub-namespace for DynamoDb models (
App\Models\Dynamo\...
) instead of using a prefix in the model name. With this, you can take advantage of the automagic benefits of Laravel's models for table names and else.
And, sorry for the lack in the documentation. I had not have much time to make some improvements I planned to. That's in the roadmap tho.