Обновление таблиц БД на основе отношений Laravel 5.8 и Eloquent - PullRequest
0 голосов
/ 06 апреля 2019

У меня проблема с обновлением таблиц, принадлежащих другой таблице. У меня есть таблица пользователей и таблица рецептов. Модель рецепта принадлежит модели пользователя, а модель пользователя имеет множество рецептов.

Каждый рецепт отображается в виде указателя в виде маленькой карточки, и на этой карточке, а также на каждой отдельной странице показа я печатаю рецепт-> автор. Когда рецепт создан, он берет атрибут username из таблицы users и устанавливает его в качестве атрибута author в таблице recipes. Однако когда я обновляю имя пользователя, атрибут author в таблице рецептов не обновляется соответствующим образом.

Модель пользователя

 public function recipes(){
        return $this->hasMany('App\Recipe');
    }

Модель рецепта

 public function user(){
        return $this->belongsTo('App\User');
    }

Можно ли добавить некоторую логику в свой UserController для учета этого при обновлении пользователя?

UserController @ update

$user = Auth::user();

        $this->validate(request(), [
            'name' => 'required',
            'username' => 'required',
        ]);

          // Handle File Upload 
          if(request()->hasfile('profile_pic')){
            // Get filename with extension
            $fileameWithExt = request()->file('profile_pic')->getClientOriginalName();
            // Get just filename
            $filename = pathinfo($fileameWithExt, PATHINFO_FILENAME);
            // Get just extension
            $extension = request()->file('profile_pic')->getClientOriginalExtension();
            // Filename to store
            $fileNameToStore = $filename . '_' . time() . '.' . $extension;
            // Upload Image
            $path = request()->file('profile_pic')->storeAs('public/profile_pictures', $fileNameToStore);
        } else {
            $fileNameToStore = 'noimage.jpg';
        }

        $user->name = request('name');
        $user->username = request('username');
        $user->description = request('description');
        $user->location = request('location');
        if(request()->hasFile('profile_pic')){
            $user->profile_pic = $fileNameToStore;
        }
        $user->push();

        $user_id = Auth::user()->id;
        return redirect()->route('user', ['id' => $user_id]);
    }

Я прочитал документы по Laravel и не могу найти ничего, что вполне могло бы сделать то, что я ищу. Буду признателен за любые рекомендации!

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Вы имеете в виду, что вы храните username в users, и вы хотите сохранить точное значение username в author из recipes?

Почему бы вам просто не ссылаться на имя, используя отношение $recipe->user->username. Он запросит вашу users таблицу на основе вашего user_id в вашем recipes и получит это username для вас.

Чтобы вы не хранили дублирующиеся данные в вашей базе данных. Должен быть только один Единственный Источник Истины . Вы можете получить данные user на основе вашего user_id, нет смысла хранить другой набор данных и постоянно обновлять его при смене источника.

Если вы находите запрос всей модели User немного тяжелым, то вы можете использовать Recipe::with('users:id,username')->get() для запроса только username.

Или

Если вы хотите сохранить текущий $recipe->author, вы можете:

// Recipe class
public function getAuthorAttribute() {
  return $this->user->username;
}
1 голос
/ 06 апреля 2019

Если вы установили внешние ключи в своих файлах миграции, вы можете добавить условие ->onUpdate('CASCADE') к имени пользователя Foreign в таблице recipes миграции.

Примечание: внешнее ограничение onCascade будет работать и вне Laravel, поскольку оно опирается только на поддержку внешних ключей ядром базы данных.

В любом случае, будьте осторожны со своей проверкой, поскольку вы должны быть уверены, что новое выбранное имя пользователя еще не используется кем-либо еще.

Предполагая, что ваша модель пользователя подключена к таблице users и имеет первичный ключ id, убедитесь, что для столбца username установлено значение уникальное в базе данных, и ** проверить * пользовательский ввод соответственно.

Первое делается путем повторного редактирования вашей миграции.

Последнее решается путем изменения ваших правил следующим образом:

// Do not forget the Rule import at the top of your controller
use Illuminate\Validation\Rule;

// Then in your method
$this->validate(request(), [
    'name' => 'required',
    'username' => [
        'required',
        Rule::unique('users', 'username')->ignore($user)
    ]
]);

Примечание: если вы изменяете миграции, вы должны повторно запустить их, чтобы применить изменение.

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