У меня есть небольшое приложение для учета практики, которое я использую с помощью Laravel для предоставления REST api. Я пытаюсь использовать красноречие отношения для обработки доставки объектов, включая их отношения.Eloquent hasOne Relationship Возвращает NULL, даже если существуют соответствующие записи
Прямо сейчас у меня есть модель «Транзакция», которая выглядит следующим образом.
class Transaction extends Model
{
protected $table = "transaction";
protected $fillable = [
"transaction_type_id",
"account_id",
"description",
"amount",
"comments",
"transaction_status_id",
"posting_date"
];
protected $guarded = [
"id"
];
public static function create(array $attributes = Array()) {
$account = BankAccount::find($attributes["account_id"]);
if ($attributes["transaction_type_id"] == 1) {
//Credit
$account["balance"] += $attributes["amount"];
} else if ($attributes["transaction_type_id"] == 2) {
//Debit
$account["balance"] -= $attributes["amount"];
}
$account->save();
parent::create($attributes);
}
public function transactionType() {
return $this->hasOne("App\Model\TransactionType", "id");
}
public function transactionStatus() {
return $this->hasOne("App\Model\TransactionStatus", "id");
}
}
Модель TransactionStatus выглядит следующим образом
class TransactionStatus extends Model
{
protected $table = "transaction_status";
protected $guarded = [
"id", "description"
];
}
И модель TransactionType выглядит следующим образом
class TransactionType extends Model
{
protected $table = "transaction_type";
protected $guarded = [
"id", "description"
];
}
У меня есть следующие в моем контроллере
return Transaction::with("TransactionType", "TransactionStatus")
->where("account_id", $accountId)
->get()
->toJson();
Это дие ry возвращает результат, который выглядит следующим образом: первый результат возвращает отношение, но каждая последующая запись имеет значение null.
{
"id": 1,
"transaction_type_id": 1,
"account_id": 1,
"description": "Morbi metus. Vivamus euismod urna.",
"amount": "4179.00",
"comments": "ullamcorper, nisl arcu iaculis enim,",
"transaction_status_id": 1,
"posting_date": "2016-12-10 21:24:25",
"created_at": "2016-12-10 00:00:00",
"updated_at": "2016-12-10 00:00:00",
"transaction_type": {
"id": 1,
"description": "Credit",
"created_at": "2016-12-09 13:37:00",
"updated_at": "2016-12-09 13:37:00"
},
"transaction_status": {
"id": 1,
"description": "Pending",
"created_at": "2016-12-09 13:37:00",
"updated_at": "2016-12-09 13:37:00"
}
},
{
"id": 3,
"transaction_type_id": 1,
"account_id": 1,
"description": "lorem ut aliquam iaculis, lacus",
"amount": "2710.00",
"comments": "ac, eleifend vitae, erat. Vivamus",
"transaction_status_id": 1,
"posting_date": "2016-07-16 04:23:34",
"created_at": "2016-12-10 00:00:00",
"updated_at": "2016-12-10 00:00:00",
"transaction_type": null,
"transaction_status": null
}
Полученный результат не имеет смысла для меня, потому что все записи в таблице транзакций имеют как transaction_type_id и transaction_status_id, поэтому они не должны быть нулевыми на всех.
Я выглядел высоко и низко, пытаясь понять, почему это может произойти, но я не смог найти объяснения. Я включил снимок экрана ниже, который показывает, как записи выглядят в таблице в MySQL.
Просто боковое примечание. В вашей модели транзакций вы используете $ fillable, а также $ guarded, вы либо $ fillable, либо $ guarded не должны использовать оба. – Donkarnash
@Donkarnash, Хорошая ловушка, документы указали, что я и пренебрег удалением $ охраняемой декларации. Благодаря! – morris295