I have a class AdBannerModel
with an HasMany
relationship to BannerLocalizedContentModel
. When validating the model I call the method alterRulesForSaving
where i want to check that the given AdBanner has at least the mandatory localizedContents. This is how I handle the check now, looking for suggestions.
$linkTextPresent = false;
$linkUrlPresent = false;
$descriptionPresent = false;
/** @var BannerLocalizedContentModel $localizedContent */
foreach ($this->localizedContents() as $localizedContent) {
if ($localizedContent->type === BannerLocalizedContentModel::TYPE_LINK_URL) {
$linkUrlPresent = true;
}
if ($localizedContent->type === BannerLocalizedContentModel::TYPE_LINK_TEXT) {
$linkTextPresent = true;
}
if ($localizedContent->type === BannerLocalizedContentModel::TYPE_DESCRIPTION) {
$descriptionPresent = true;
}
}
if (!$linkUrlPresent || !$linkTextPresent || !$descriptionPresent) {
throw new ValidationErrorException(['content_i18n' => 'missing mandatory content.'], 'error.invalid_data');
}
CodePudding user response:
you can check existence of relation with needed params
// assuming you provide AdBannerModel code
// your HasMany relation
public function bannerLocalizedContentModels() {
return $this->hasMany(BannerLocalizedContentModel::class);
}
public function alterRulesForSaving(/*params if any*/) {
//...
$mandatoryContents = [
BannerLocalizedContentModel::TYPE_LINK_URL,
BannerLocalizedContentModel::TYPE_LINK_TEXT,
BannerLocalizedContentModel::TYPE_DESCRIPTION
];
if ($this->bannerLocalizedContentModels()->whereIn('type', $mandatoryContents)->doesntExist()) {
throw new ValidationErrorException(['content_i18n' => 'missing mandatory content.'], 'error.invalid_data');
}
}