Laravel 5.7 firstOrNew не устанавливает предоставленные значения для нового случая - PullRequest
2 голосов
/ 09 апреля 2019

Я новичок в Laravel и пробую метод firstOrNew Eloquent, как описано в документации .

У меня есть следующая таблица в MySQL:

SELECT * FROM `ratings`;
+----+-----------+-----------+--------+---------------------+---------------------+
| id | realty_id | client_id | rating | created_at          | updated_at          |
+----+-----------+-----------+--------+---------------------+---------------------+
|  1 |        67 |     29548 |     -1 | 2019-03-23 12:14:32 | 2019-03-23 12:26:57 |
|  2 |        67 |     29549 |      1 | 2019-03-23 12:14:53 | 2019-03-23 12:14:53 |
|  3 |        67 |     29547 |      1 | 2019-03-23 12:20:47 | 2019-03-23 12:20:47 |
|  4 |        67 |     29546 |      1 | 2019-03-23 12:24:47 | 2019-03-23 12:26:52 |
+----+-----------+-----------+--------+---------------------+---------------------+
4 rows in set (0,00 sec)

В Laravel моя модель Rating настроена следующим образом:

<?php
namespace App\Models;
use App\Models\BaseModel;

class Rating extends BaseModel
{
    protected $table = 'ratings';

    protected $fillable = [
        'client_id',
        'realty_id',
        'rating',
    ];


    public function realty()
    {
        return $this->belongsTo('App\Models\Realty');
    }

    public function client()
    {
        return $this->belongsTo('App\Models\Client');
    }

}

Когда я пытаюсь извлечь существующую запись, пропустив существующие client_id и realty_id, яполучить ожидаемый результат:

$rating = Rating::firstOrNew([
    'client_id' => 29548,
    'realty_id' => 67,
]);

dd([$rating->client_id, $rating->realty_id]);
/*
Results in
array:2 [▼
  0 => 29548
  1 => 67
]
*/

Однако, когда я пытаюсь использовать тот же код с несуществующим client_id (скажем, это его первая отправка рейтинга), я получаю null для обоих свойств:

$rating = Rating::firstOrNew([
    'client_id' => 29550, // THIS ID IS NOT IN THE `ratings` TABLE
    'realty_id' => 67,
]);

dd([$rating->client_id, $rating->realty_id]);
/*
Results in
array:2 [▼
  0 => null
  1 => null
]
*/

Если я пытаюсь использовать firstOrCreate вместо firstOrNew, я получаю внутреннюю ошибку сервера со следующим сообщением:

SQLSTATE [23000]: целостностьнарушение ограничения: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (aptoadmi_aptovc. ratings, CONSTRAINT realty_ratings_fk FOREIGN KEY (realty_id) ССЫЛКИ realties (id) ON УДАЛИТЬ КАСКАД ВКЛОБНОВЛЕНИЕ КАСКАДА) (SQL: вставить в ratings (updated_at, created_at) значения (2019-04-09 17:44:09, 2019-04-09 17: 44:09))

Что ожидается, поскольку значения client_id и realty_id не передаются в оператор INSERT.

Что яделаешь неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...