I'm encountering a weird problem in my Laravel 9 project.
I have this model Team, with a logo relation to another model ImageVersion, and a city relation to a City model, they're defined like this:
public function city(): BelongsTo
{
return $this->belongsTo(City::class);
}
public function logo(): BelongsTo
{
return $this->belongsTo(ImageVersion::class, 'logo_image_version_id');
}
The problem is, when i'm creating a new Team, and setting both city_id and logo_image_version_id, only the city becomes available with $team->city, $team->logo stays null.
This is the code:
public function update(Team $team, CreateOrUpdateTeamDto $dto): Team
{
if ($team->logo && $team->logo->image_id !== $dto->logo_image_id) {
$this->imageService->deleteVersion($team->logo);
}
$team->name = $dto->name;
$team->manager = $dto->manager;
$team->location = $dto->location;
$team->city_id = $dto->city_id;
if ($dto->logo_image_id) {
$version = $this->imageService->createVersionIfDoesntExistFromId($dto->logo_image_id, 512, 512, keepWhenUnused: false);
$team->logo_image_version_id = $version->id;
}
$team->save();
return $team;
}
public function create(CreateOrUpdateTeamDto $dto): Team
{
$team = new Team();
return $this->update($team, $dto);
}
If I do a GET request on the Team I just created, I can access logo just fine, so there's probably no problems with the relation definition itself, the problem just happens in the request that creates it.
I know that I could probably just do a $team->refresh() before returning it, but I find it weird that it works just fine for city.
These are the queries logged by the request that creates the Team:
select * from `images_versions` where `image_id` = ? and `width` = ? and `height` = ? and `mime_type` = ? limit 1;
select * from `images` where `images`.`id` in (5);
insert into `teams` (`name`, `manager`, `location`, `city_id`, `logo_image_version_id`, `created_by_id`, `updated_by_id`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?, ?, ?, ?, ?);
select * from `cities` where `cities`.`id` = ? limit 1;
select * from `states` where `states`.`id` in (6);
CodePudding user response:
One way to fix this is after $team->logo_image_version_id = $version->id; try adding unset($team->logo); to remove the null $team->logo
I believe when you are calling
$team->logo
in
if ($team->logo && $team->logo->image_id !== $dto->logo_image_id) {
$this->imageService->deleteVersion($team->logo);
}
if the $team object does not yet have a logo_image_version_id, just calling $team->logo will set the logo property to null. Then after when you add the logo_image_version_id $team->logo is still null. And does not re query the DB
CodePudding user response:
Is the field logo_image_version_id fillable ?
Are you sure $version->id is not null ?
Can you tell me what does $team->logo()->toSql() returns ?
