Я написал класс под названием Categorizable
что позволяет полиморфные отношения многие ко многим между классом, который расширяет его и классом Category
, Это прекрасно работает, но я заметил, что если я вызываю метод для добавления категории к категорируемому объекту, он добавляет запись в таблицу соединений, но мой фактический объект не обновляется. Если я попытаюсь позвонить categories
на моем объекте, он не обновляется с тем, что находится в базе данных. Я хотел бы поддерживать свои объекты в актуальном состоянии, поэтому мне не нужно запрашивать базу данных каждый раз, когда я добавляю категорию.
Categorizable.php
class Categorizable extends Model{
public function categories(){
return $this->morphToMany(Category::class, 'categorizable');
}
public function addCategory(\App\Category $category){
if ( $this->isValidCategory($category) ){
if ( $this->hasCategory($category) ){
return false;
}
else{
$this->categories()->save($category);
return true;
}
}
else{
return false;
}
}
public function removeCategory(\App\Category $category){
if ( $this->isValidCategory($category) ) {
if ($this->hasCategory($category)) {
$this->categories()->detach($category);
return true;
}
else {
return false;
}
}
else{
return false;
}
}
public function hasCategory(\App\Category $category){
return $this->categories->contains($category);
}
public function isValidCategory(\App\Category $category){
if ( $category->category_type === get_class( $this ) ){
return true;
}
else{
return false;
}
}
Если это невозможно с Laravel 5.2 или считается плохой практикой, скажите, пожалуйста. Если у вас есть какие-либо рекомендации о том, как я могу улучшить это, это тоже приветствуется. Благодарю.
Рассмотрите возможность обработки этого в контроллере, как описано в https://laravel.com/docs/5.4/eloquent-relationships#updating-many-to-many-relationships
Это упростит то, что вы хотите достичь. Давайте предположим, что категории связаны со статьей, а контроллером является ArticleController. $ article — это объект модели, и проверка isValidCategory () выполнена. Добавить категорию или удалить одну становится:
$article->categories()->attach($category->id);
$article->categories()->detach($category->id);
Сброс всех отношений этой статьи:
$article->categories()->detach();
$article->categories()->attach($categories); //flat array
Или сделать это в одной строке:
$article->categories()->sync($categories);
Помните, что вы можете использовать один идентификатор или массив из идентификаторов, как [1, 2, 3]
Замечания: $category->id
это предположение, если $ category это идентификатор, то, очевидно, использовать $category
Других решений пока нет …