Задать вопрос
ITwoolf
@ITwoolf

Как производить поиск по имени, что бы получить id?

Всем привет. У меня 2 таблицы. Авторы и Книги (каждый со своими полями). В таблице с книгами есть поле ид автора, которое отображалось. Я через вюшку сделал так, что бы вместо ид автора в данной таблице отображалась имя автора из таблицы с авторами. Сделал экспорт таблицы Книг. Как и полагалось он экспортировал вместе с другими полями имя автора из др таблицы, а не ид.
Теперь я делаю импорт таблицы.
И мне нужно производить поиск в бд по имени и найти ид автора, подставив его.
Или цитирую слова своего препода

автора тебе на надо создавать нового. надо по его имени производить поиск в бд и получать его ид, чтобы потом подставить его в создаваемую модель книги

нет. ничего не надо убирать. ты грузишь данные из файла. вместо ид автора у тебя его имя. ты берешь это имя, делаешь запрос к бд (ищешь по имени автора), получаешь данные по этому автору и берешь из них его ид


Вот код импорта. Нужно изменить строку с $model-> id_avtor1 = $row [4];

public function actionUpload()
    {
        $model = new UploadForm();
        if (Yii::$app->request->isPost ) {
            $model->fName = UploadedFile::getInstance($model, 'fName');
            if ($fName =$model->upload()) {
                    //путь к файлу

                    if (($handle = fopen($fName, 'r')) !== false) {


                        while (($row = fgetcsv($handle, 1000, ',')) !== false) {
                            if ($row[0]=='ID' and $row[0]=='#'){
                                continue;}
                            $model = new Kniga1();
                            $model->name = $row [2];
                            $model-> id_avtor1  =  $row [4];
                            $model->creation_date = $row [5];
                            
                            if ($model->validate()) {
                                $model->save();

                            } else {
                                $model->save();
                                print_r($model->errors);
                            }
                        }
                        fclose($handle);
                    };
                    //... код после импорта
            }

        }
        return $this->render('upload', ['model' => $model]);
    }
  • Вопрос задан
  • 167 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
Во это неверно.
if ($model->validate()) {
    $model->save();
  } else {
    $model->save();
    print_r($model->errors);
  }

Если атрибуты не прошли валидацию, то зачем пытаться опять сохранить модель? Ничего не произойдёт. Просто выводите ошибки.
Нужно изменить строку с $model-> id_avtor1 = $row [4];

Если в $row[4] у Вас хранится имя автора, то сделайте метод, который будет искать в таблице `author` автора по его имени и возвращать его id.
Как-то так, статический метод в модели Author:
public static function getIdAuthor($name){
    return Author::find()->select('id')->where('name=:name',[':name' => $name])->column();
}

И подставляете в строку
$model-> id_avtor1 = Author::idAuthor($row[4]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы