За последние 24 часа нас посетили 19376 программистов и 1660 роботов. Сейчас ищут 1207 программистов ...

Один ко многим

Тема в разделе "Laravel", создана пользователем Alex5646, 7 янв 2016.

  1. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Имеется две таблицы:
    Users:
    Код (PHP):
    1. $table->increments('id');
    2. $table->string('surname');
    3. $table->string('name');
    4. $table->string('middlename');
    5. $table->string('email')->unique();
    6. $table->string('password', 60);
    7. $table->rememberToken();
    8. $table->timestamps(); 
    Posts:
    Код (PHP):
    1. $table->increments('id');
    2. $table->string('title');
    3. $table->text('description');
    4. $table->text('content');
    5. $table->text('user_id');
    6. $table->timestamps(); 
    И два класса User, Post. Так вот я уже устал читать документации, не понимаю какие методы для этого нужны, эсепшены вылетают, только от них не кокого толка. Ребят помогите написать два метода для установки зависимости, к одному пользователю должно относиться несколько записей.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    показывай
     
  3. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    ErrorException in 0373811c97699a76e12273b84b2a73ebfd9577d5.php line 17:
    Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name (View: D:\OpenServer\domains\laravel\resources\views\post.blade.php)

    ErrorException in 0373811c97699a76e12273b84b2a73ebfd9577d5.php line 17:
    Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

    В шаблоне:
    Код (PHP):
    1. {{ $post->user()->name }}
    В классе Post:
    Код (PHP):
    1. public function user()
    2. {
    3.   return $this->belongsTo('App\User');
    4. }
    Добавлено спустя 9 минут 49 секунд:
    Из контроллера идет переменная $post.
    Код (PHP):
    1. public function getPost($id)
    2. {
    3.   $post = Post::findOrFail($id);
    4.   return view('post')->with('post', $post);
    5. }
    Добавлено спустя 41 минуту 37 секунд:
    Всё уже сам разобрался перечитывая очередной раз документацию, я случайно заметил что не правильно пользуюсь методами.
    Было:
    Код (PHP):
    1. {{ $post->user()->name }} 
    Должно было быть:
    Код (PHP):
    1. {{ $post->user()->first()->name }}
    2. // Или
    3. {{ $post->user->name }} 
    Как всегда ошибка или ерунды, откуда я мог знать что $post->user()->name скобочки не нужны.
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Abyss и что ему даст этот vardump применительно к проблеме?

    Код (PHP):
    1. $table->text('user_id');
    Код (PHP):
    1. $table->integer('user_id')]->unsigned() 
    Не надо делать связующее поле текстовым.

    В модели User:
    Код (PHP):
    1. public function posts()
    2. {
    3.     return $this->hasMany('App\Post');
    4. }
    В модели Post:
    Код (PHP):
    1. public function post()
    2. {
    3.     return $this->belongsTo('App\User');
    4. }
    $user->posts() возвращает объект запроса на который можно навесить дополнительные условия:
    Код (PHP):
    1. $user->posts()->where('active', 1)->get(); 
    $user->posts же просто возвращает коллекцию связанных записей.

    http://laravel.su/docs/5.0/eloquent#relationships

    Коллекции: https://laravel.com/docs/5.2/collections (перевод не запилили ещё)
     
  6. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Текстовое оно от не внимательности, а вот если user_id сделать уникальным, сможет ли пользователь относиться к нескольким записям, ведь user_id не должен повторяться в таблице?

    Добавлено спустя 9 минут 9 секунд:
    А вот у меня встал вопрос как организовать метки для записей, есть уже таблица tags и таблица posts, отношение многие ко многим. Вроде всё хорошо но: Как добавить метки для записи, если её не существует? Как удалять метку если она не относиться не к одной записи? Как проверять существует ли отношение метки и записи? И как проверить существование самой метки?

    Добавлено спустя 1 минуту 8 секунд:
    Я только и читаю это, последнее время.
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А зачем делать поле уникальным, если значения в нем заведомо могут повторяться? )

    Это связь "многие ко многим", реализуется через связующую таблицу, подробно описано в документации ) А метка - точно такое же поле в таблице, как и любое другое. Есть запись метки, есть запись поста, есть связь между моделями и набор методов для работы с этой связью. Конкретно в каком месте затык? Можно кстати не мудрить, а воспользоваться (или посмотреть) готовым пакетом, к примеру вот: https://github.com/rtconner/laravel-tagging
     
  8. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Рассеянный сегодня я, unsigned не правильно прочитал.
    Я это уже реализовал, я же писал.
    В логике работы методов класса post и tag, надо как то удалять метки которые не имеют отношений. И при добавлении поста если нету метки создавать её, но тут вроде всё понятно, а про удаление в голову не чего не приходит.
    При удаление и создание поста можно запускать метод удаляющий метки не имеющие отношений. Так вот как найти метки которые не относятся не к одному посту.
    Я первый раз использую laravel, лучше по мудрить для ознакомления, да и кто му же вдруг я изобрету очередную панацею, от всех моих проблем?
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Сейчас под рукой даже IDE нету, но примерно так:
    Код (PHP):
    1. $tag->doesntHave('posts')->delete()
    Ну, можно и не брать, но посмотреть как реализовано там (не конкретно в этом пакете, а вообще, у других) определенно стоит.

    p.s. стоит учесть, что документация в последних версиях значительно расширилась, но до сих пор там много чего не описано.
     
  10. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Попробую.

    Стоит, но я думаю из этого не чего хорошего не выйдет, так как мало пакетов для реализации меток, а вот к примеру реализацию ролей пользователей я подсмотрел. Да и к тому же я плохо знаю об классах и методах laravel и восприятие чужого кода не много затруднительно.

    Всё равно её мало приходиться лазить по коду и узнавать какой метод что возвращает.
     
  11. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Гугло поиск мне не дал не чего по запросу "doesn't have laravel" конкретно по методу doesntHave() не уверен что такое существует, зато нашёл has('tags', '=', 0).
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  13. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Спасибо, хрен бы сам нашёл.