За последние 24 часа нас посетили 17978 программистов и 1579 роботов. Сейчас ищут 1008 программистов ...

Прикрепление изображений к записям

Тема в разделе "Laravel", создана пользователем yanuzay, 7 июл 2018.

  1. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    Здравствуйте.
    Делаю блог на laravel.

    Пытаюсь сделать прикрепление изображений к записи через связанную таблицу, а все ссылки на фото хранятся в отдельной таблице.

    Выбираю через input type file изображение к записи , сохраняю и выходит sql ошибка:

    Код (Text):
    1. SQLSTATE[HY000]: General error: 1366
    2. Incorrect integer value: 'test.png' for column 'image_to_article_id' at row 2 (
    3. SQL: insert into `image_to_articles` (`image_id`, `image_to_article_id`) values
    4. (1, 0),
    5. (1, test.png),
    6. (1, image/png),
    7. (1, 1644),
    8.  (1, 0),
    9.  (1, ))
    Таблица `image_to_articles` связывает записи с изображением, а столбец `image_id` содержит id изображений из таблицы с изображениями, столбец `image_to_article_id` - id записи.

    Но laravel всю инфу о фото пытается записать, к тому же test.png это старое название фотки, а в переименованном виде фото успешно сохраняется несмотря на ошибку выше.

    Как можно исправить?
     
    #1 yanuzay, 7 июл 2018
    Последнее редактирование: 7 июл 2018
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    А твой код все должны телепатически смотреть? Исходи из того, что в Laravel всё правильно написано, ошибка у тебя где-то.
     
  3. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    Код контроллера сохраняющий запись:
    PHP:
    1.    
    2. <?php
    3.  
    4. namespace App\Http\Controllers\Admin;
    5.  
    6. use App\Article;
    7. use App\Category;
    8. use App\Image;
    9. use Illuminate\Http\Request;
    10. use App\Http\Controllers\Controller;
    11.  
    12. class ArticleController extends Controller
    13. {
    14. /* .... */
    15.  public function store(Request $request)
    16.     {
    17.         $article = Article::create($request->all());
    18.  
    19.         if($request->input('categories')) :
    20.            $article->categories()->attach($request->input('categories'));
    21.         endif;
    22.        
    23.         if($request->file('images')):
    24.            $imageName = time() . '.' . $request->file('images')->getClientOriginalExtension();
    25.            $request->file('images')->move(public_path('images'), $imageName);
    26.            $article->images()->attach($imageName);
    27.         endif;
    28.  
    29.         return redirect()->route('admin.article.index');
    30.     }
    31. /* .... */
    32.  
    33. }
    Сейчас sql ошибка такая :
    Код (Text):
    1. SQLSTATE[01000]:
    2. Warning: 1265
    3.  Data truncated for column 'image_to_article_id' at row 1 (SQL:
    4.  insert into `image_to_articles` (`image_id`, `image_to_article_id`)
    5. values (1, 1530966556.png))
    Раньше в метод attach() передавался $request->file('images') , а сейчас так $article->images()->attach($imageName);

    Модель Image:

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Image extends Model
    8. {
    9.     protected $fillable = ['image', 'miniature'];
    10.    
    11.     public function articles()
    12.     {
    13.       return $this->belongsToMany('App\Article', 'image_to_articles', 'image_to_article_id', 'image_id');
    14.     }
    15. }
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну ты слишком много от Laravel хочешь :) Читай, что такое belongsToMany (кстати, нафига тебе многие ко многим здесь? Одну и ту же картинку хочешь к разным статьям крепить?).
    В Attach должна идти модель, а не строка, ты хочешь, чтоб Laravel твои мысли прочитал, и определил, в какое поле таблицы записать $imageName?
     
    yanuzay нравится это.
  5. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    нет. не продумал сразу.

    может метод attach не стоит использовать применительно к изображениям?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Метод attach крепит экземпляр одной модели к другой. Ты передаёшь туда строку (Laravel без понятия, что у тебя там изображение, и, по ходу, обнаружив скаляр вместо объекта, думает что это id другой модели)
     
  7. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    понятно. можете подсказать чем заменить attach и associate , когда отношение hasMany и hasOne?
    я новичок в ларавел
     
  8. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    вместе с belongsTo associate нужно использовать это понятно
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    А мне обязательно сюда документацию перепечатывать? Сам почитать никак не можешь? http://laravel.com/docs/master, где-то была на русском, кажется на laravel.su, но я не пользуюсь, я читаю по-английски
     
  10. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    501
    Симпатии:
    58
    Спасибо. все работает