Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 10.04.2015 12:29:58

Arat
Откуда: Киев
Сообщений: 116

Снова отношения моделей. Полиморфическая связь?

Прошу помощи и разъяснения. Из документации не могу понять что мне нужно сделать.
Есть таблицы

Таблица проектов портфолио - projects:
id
title
body
cover

Таблица тегов для проектов портфолио - tags:
id
title

Пивотная таблица для предыдущих - project_tag:
id
project_id
tag_id

Таблица фото для проектов - photos:
id
project_id
path

Задача при выводе проекта выводить также теги проекта, при выводе страницы тегов - всех проектов по этому тегу. Тут проблем нет, многие-ко многим в помощь.
Как вывести все фото проектов при загрузке страницы тега?
Другими словами, при загрузке страницы конкретного тега нужно выводить все проект по этому тегу и все фото этих проектов.
Полиморфия нужна? Но в ней запутался совсем sad

Не в сети

#2 10.04.2015 14:47:06

Re: Снова отношения моделей. Полиморфическая связь?

полиморфия не нужна. во-первых есть hasManyThrough, во-вторых, если выводятся проекты и их фото в привязке к проектам, то можно просто их загрузить вместе. eager loading поддерживает загрузку вложенных связей. PHPTag::with('projects.photos')->get() загрузит и проекты и их фотографии.

Не в сети

#3 10.04.2015 14:48:41

Re: Снова отношения моделей. Полиморфическая связь?

Project hasMany Photos

Tag::with(projects.photos)

Нет, не нужна.

Не в сети

#4 10.04.2015 14:56:37

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Т.е. я одним запросом в Tag моделе могу сделать весь вывод? Отдельно запрашивать проекты не надо получается?

Изменено Arat (10.04.2015 14:59:06)

Не в сети

#5 10.04.2015 16:02:04

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Спасибо, ребята!

Не в сети

#6 10.04.2015 16:52:39

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Так, что-то не пошло.
Итак,

PHP
// Project.php
public function photos() {
return 
$this->hasMany('Photo');
}
PHP
//TagController.php
public function getTag($id) {
$photos Tag::getPhotos($id);
}
PHP
//Tag.php
public static function getPhotos($id) {
$photos Tag::with('projects.photos')->get();

return 
$photos;
}

В итоге ничего не выводит из фоток. ЧЯНТ?

Не в сети

#7 30.04.2015 15:52:15

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Блин, вопрос остался открытым :(

Не в сети

#8 13.05.2015 17:18:16

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

constb пишет:

полиморфия не нужна. во-первых есть hasManyThrough, во-вторых, если выводятся проекты и их фото в привязке к проектам, то можно просто их загрузить вместе. eager loading поддерживает загрузку вложенных связей. %%(php)Tag::with('projects.photos')->get()%% загрузит и проекты и их фотографии.

Апдейт.
Проекты не выводятся. Выводятся только их фото. Получилось так, что выводит только фото последнего (по id) проекта.
Не получается, блин sad

Не в сети

#9 13.05.2015 18:17:54

Re: Снова отношения моделей. Полиморфическая связь?

$tags = Tag::with('projects.photos')->get()

foreach($tags as $tag) {
  <section>
    <h2>$tag->title</h2>
    
    <h3>Проекты:</h3>
    <article>
      foreach($tag->projects as $project) {
        <h4>$project->title</h4>
        
        <h5>Фото проекта:</h5>
        foreach($project->photos as $photo) {
          <img src="$photo->url">
        }
      }
    </article>
  </section>
}

Не в сети

#10 13.05.2015 23:02:13

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Хм... это при выводе всех тегов.
У меня задача немного иная. При вызове конкретного тега, нужно вывести фото всех проектов, которые относятся к этому тегу.

Не могу я вкурить как правильно применить hasManyThrough...

Не в сети

#11 13.05.2015 23:25:31

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Что получается:

PHP
//Tag.php
public function projects() {
        return 
$this->belongsToMany('Project');
    }

    public function 
photos() {
        return 
$this->hasManyThrough('Project''Photo''project_id''tag_id');
    }
PHP
//Project.php
public function tags() {
        return 
$this->belongsToMany('Tag');
    }

    public function 
photos() {
        return 
$this->hasMany('Photo');
    }
PHP
//Photo.php
public function project() {
    return 
$this->belongsTo('Project');
    }
PHP
//TagController.php
$tag Tag::getTag($id);

$tags Tag::getTags();

return 
View::make('pages.services')->with('tag'$tag)->with('tags'$tags);

Понятно, что сейчас фото не выводит. Вот я и не могу понять как вывести фото для $tag = Tag::getTag($id);
Подскажите, плиз!

Не в сети

#12 14.05.2015 20:51:34

Re: Снова отношения моделей. Полиморфическая связь?

Ошибка то какая?

Судя по примеру из доков, это не будет работать с manyToMany. Нужен tag_id в projects.

Ну и должно быть $this->hasManyThrough('Photo', 'Project')

Не в сети

#13 14.05.2015 21:11:16

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Wide пишет:

Ошибка то какая?

Судя по примеру из доков, это не будет работать с manyToMany. Нужен tag_id в projects.

Ну и должно быть $this->hasManyThrough('Photo', 'Project')

Ошибки нет. Просто не тянет фото из базы.
Блин, tag_id в projects не пойдет - много-ко-многим с tags через пивотную таблицу.
Какие могут быть варианты тогда?

Не в сети

#14 14.05.2015 21:22:24

Re: Снова отношения моделей. Полиморфическая связь?

dd(Tag::find(1)->photos) что выводит?

Не в сети

#15 15.05.2015 12:33:38

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Wide пишет:

dd(Tag::find(1)->photos) что выводит?

Column not found: 1054
Unknown column 'projects.tag_id'

Не в сети

#16 15.05.2015 12:40:21

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

если

PHP
foreach ($tag->projects as $project) {
   
$photos Photo::getPhotos($project->id);
}

то выводит фото последнего (по id) проекта

ПыСы

PHP
//Photo.php
public static function getPhotos($id) {
    
$photos Photo::where('project_id''='$id)->get();

    return 
$photos;
}

Не в сети

#17 15.05.2015 20:09:21

Re: Снова отношения моделей. Полиморфическая связь?

Arat пишет:

}%если
%%(php)
foreach ($tag->projects as $project) {
   $photos = Photo::getPhotos($project->id);
}
%%
то выводит фото последнего (по id) проекта

Потому что в цикле переменная перезаписывается и остается последнее значение. Нужен массив $photos[]

Зачем в каждой итерации заново дергать базу? Все данные уже есть в $project->photos

Уверен, что можно найти более элегантное решение. Например вот тут что-то есть http://laravel.io/forum/03-04-2014-hasm … ny-to-many

Не в сети

#18 19.05.2015 17:16:45

Arat
Откуда: Киев
Сообщений: 116

Re: Снова отношения моделей. Полиморфическая связь?

Не подчерпнул я там идею sad

Не в сети

Подвал раздела