Laravel по-русски

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

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

#1 13.11.2014 08:13:28

Связи

Есть два моделя

Class Post extends Eloquent {

     public function comment()
     {
          
         return $this->hasMany('Comment','posts_id');    
     }

и

Class Comment extends Eloquent {

      public function post()
    {
        return $this->belongsTo('Post','posts_id');
    }

делаю так

$comment = Comment::all();

	   foreach($comment as $com) {
	    echo $com->post->title;
		
		}

через comment работает.

Как через модель post получить данные из comment? Делаю так

   $posts = Post::all();
	  
	   foreach($posts as $post) {
	 echo $post->comment->id;
       }

Так не работает,в чем дело?

Не в сети

#2 13.11.2014 09:31:51

Re: Связи

Eager loading: пользуйте with('comments')

Не в сети

#3 13.11.2014 12:28:40

Re: Связи

SMGladkovskiy пишет:

Eager loading: пользуйте with('comments')

Сделал так

$posts = Post::with('comment')->get();
	   foreach($posts as $post) {
	 echo $post->comment;
       }

вернул

[{"id":2,"comment":"comment","posts_id":1}][{"id":3,"comment":"comment post 2","posts_id":2}]

как мне вернуть только данные комента id итд? только не в таком виде как json. Как сделать такой запрос с одним записем например? find($id) итп

с кодом покажи плз)

Изменено Nelzz (13.11.2014 12:31:44)

Не в сети

#4 13.11.2014 12:32:24

Re: Связи

Так пробовали?

$posts->comment->lists('id');

Collections

Не в сети

#5 13.11.2014 12:47:21

Re: Связи

А, у вас n:m... Тут в одну строку я что-т не придумаю как сделать. Вот на ум приходит такое:

$posts = Post::with('comments')->get();
$posts->comments_ids = [];
$posts->each(function($post) use ($posts){ $posts->comments_ids[] = $posts->comments->lists('id');});

dd($posts->comments_ids );

Изменено SMGladkovskiy (13.11.2014 12:47:35)

Не в сети

#6 13.11.2014 12:48:59

Re: Связи

Однако ,если Вам нужны только id комментариев, то не проще ли идти от них:

$comments_ids = Comment::whereIn('post_id', $posts_ids)->lists('id');

Не в сети

#7 13.11.2014 12:52:06

Re: Связи

Блин, так вопрос был - показать только данные коммента? Так в третьем сообщении у Вас и выводятся данные коммента. То,  что они в json форматируются, так это от того, что коллекцию к строке приводите. Выведите нормально:

echo $post->comment->id;
echo $post->comment->comment;
echo $post->comment->post_id;

Не в сети

#8 13.11.2014 13:03:55

Re: Связи

SMGladkovskiy пишет:

Блин, так вопрос был - показать только данные коммента? Так в третьем сообщении у Вас и выводятся данные коммента. То,  что они в json форматируются, так это от того, что коллекцию к строке приводите. Выведите нормально:

echo $post->comment->id;
echo $post->comment->comment;
echo $post->comment->post_id;

Через пост вытащит данные комента.

Делал я так

echo $post->comment->id;
echo $post->comment->comment;
echo $post->comment->post_id;

так не работает,ошибка. Даже стройный дебагер нету neutral

Изменено Nelzz (13.11.2014 13:07:48)

Не в сети

#9 13.11.2014 13:15:11

Re: Связи

Тогда проверяйте, как у Вас всё прописано в модели. Ну и ошибки покажите. А то никак не удаётся отрастить телепатические интерфейсы...

Изменено SMGladkovskiy (13.11.2014 13:15:19)

Не в сети

#10 13.11.2014 13:44:39

Re: Связи

SMGladkovskiy пишет:

Тогда проверяйте, как у Вас всё прописано в модели. Ну и ошибки покажите. А то никак не удаётся отрастить телепатические интерфейсы...

Ну в модели,как на первом посте нечего лишнего,только связи и все. В общем поставил дебагер

ошибка Undefined property: Illuminate\Database\Eloquent\Collection::$id

Код

$posts = Post::with('comment')->get();
	   foreach($posts as $post) {
			echo $post->comment->id;

Не в сети

#11 13.11.2014 14:11:23

Re: Связи

Получился так

$posts = Post::with('comment')->get();
	   foreach($posts as $post) {
			foreach($post->comment as $comment) {
			echo $comment->id;
       }

но как то тут все не чисто через двойной подбор делать. Может есть и другой способ.

Не в сети

#12 13.11.2014 14:23:41

Re: Связи

Распишите нормально отношения:

Class Post extends Eloquent {

     public function comments()
     {
          
         return $this->hasMany('Comment','posts_id');    
     }

В коде при выгрузке постов (выгружаете коллекцию), у Вас будут в каждой модели в этой коллекции ещё комменты (коллекции).

$posts = Post::with('comments')->get();

foreach($posts as $post)
{
    $comments_of_posts[$post->id] = $post->comments->toArray();
}

И вот $comments_of_posts содержит массив с комментами для постов.

Если Что-то в данной конструкции Вам не нравится - тогда озвучивайте задачу. Что Вы хотите сделать? И почему именно так это намереваетесь реализовать?

Изменено SMGladkovskiy (13.11.2014 14:23:56)

Не в сети

#13 13.11.2014 16:10:52

Re: Связи

SMGladkovskiy пишет:

Распишите нормально отношения:

Class Post extends Eloquent {

     public function comments()
     {
          
         return $this->hasMany('Comment','posts_id');    
     }

В коде при выгрузке постов (выгружаете коллекцию), у Вас будут в каждой модели в этой коллекции ещё комменты (коллекции).

$posts = Post::with('comments')->get();

foreach($posts as $post)
{
    $comments_of_posts[$post->id] = $post->comments->toArray();
}

И вот $comments_of_posts содержит массив с комментами для постов.

Если Что-то в данной конструкции Вам не нравится - тогда озвучивайте задачу. Что Вы хотите сделать? И почему именно так это намереваетесь реализовать?

сделал через лист

var_dump($comments_of_posts[$post->id] = $post->comment->lists('id'));

и  var_dump($post->comment->lists('id')); тоже самое
результат как ожидалось.

array (size=1)
  0 => int 2
array (size=1)
  0 => int 3

Array to string conversion когда делаю echo,как теперь вернуть в нормальный вид? У нас он вернул массив. Надо просто вернул ид итд.

Надо еще выборку для коммента (where)

Что я хочу сделать сказал же "Через пост вытащит данные комента" Задача моя точно такая же,но в другом виде. Я специально cделал пример с постом и коментом,так будет легче понятно и вам и мне.  Мы на правильном пути smile

Изменено Nelzz (13.11.2014 16:17:01)

Не в сети

#14 13.11.2014 16:21:08

Re: Связи

Nelzz пишет:

Что я хочу сделать сказал же "Через пост вытащит данные комента" Задача моя точно такая же,но в другом виде. Я специально cделал пример с постом и коментом,так будет легче понятно и вам и мне.  Мы на правильном пути smile

Вы хотите вытащить данные коммента из коллекции постов? Какого именно коммента? какого именно поста? Какие граничные условия? Для чего именно это делается? Конкретно и предметно давайте, а то у Вас сферический конь в вакууме и Вы задаётесь вопросом, как далеко он улетит, если он наестся десятью кило гороха и пропердится...

Если задлача так и стоит - вывести все посты и все комменты к ним на одной странице, то именно перечислениями коллекций и отображением данных (через вьюшки), Вы данную задачу и решите.
Что именно у Вас не получается и какая именно задача перед Вам стоит? Я не спрашиваю, как Вы решили эту задачу решить, а именно первоначальные, так сказать, бизнес-требования. Например, "отобразить все комментарии к посту в списке с отображением даты, автора и содержания" - вот так.

Не в сети

#15 13.11.2014 16:47:06

Re: Связи

SMGladkovskiy пишет:
Nelzz пишет:

Что я хочу сделать сказал же "Через пост вытащит данные комента" Задача моя точно такая же,но в другом виде. Я специально cделал пример с постом и коментом,так будет легче понятно и вам и мне.  Мы на правильном пути smile

Вы хотите вытащить данные коммента из коллекции постов? Какого именно коммента? какого именно поста? Какие граничные условия? Для чего именно это делается? Конкретно и предметно давайте, а то у Вас сферический конь в вакууме и Вы задаётесь вопросом, как далеко он улетит, если он наестся десятью кило гороха и пропердится...

Если задлача так и стоит - вывести все посты и все комменты к ним на одной странице, то именно перечислениями коллекций и отображением данных (через вьюшки), Вы данную задачу и решите.
Что именно у Вас не получается и какая именно задача перед Вам стоит? Я не спрашиваю, как Вы решили эту задачу решить, а именно первоначальные, так сказать, бизнес-требования. Например, "отобразить все комментарии к посту в списке с отображением даты, автора и содержания" - вот так.

Я лучше объясню суть задачи. У меня есть модели Компании и Контакта.

Модель Контакта тут только связь

 public function company()
 {

      return $this->belongsTo('Company','id_com');


}

модель Компания тут тоже связь

 public function contact()
 {

       return $this->hasMany('Contact','id_com');

 }

связ идет через Контакты на Компанию. В таблице Контакты есть поля id_com (id компании)

Так вот когда захожу на компанию (show) через его ид должен выташит все контакты с таким ид на id_com. Мне нужно контакты компании.

Так вот как мне сделать такой запрос через модель компании с выборкой? Теперь мы вернулись из чего начинали,тут тоже самое анология)

Изменено Nelzz (13.11.2014 16:48:59)

Не в сети

#16 13.11.2014 19:41:02

Re: Связи

Вы неправильно называете связи. Комментарии надо называть comments() , а контакты - contacts() - их же Many, несколько, и возвращается коллекция объектов, а не один объект. На работу это не влияет, но на понимание кода - влияет сильно. Вот вы, например, попались на эту семантическую ловушку в самом начале, когда запросили сие:

$posts = Post::all();
foreach($posts as $post) {
echo $post->comment->id;
}

$post->comment - это не один объект, у которого есть id, это коллекция. Если бы оно называлось comments , вы бы это заметили, и сделали по нему foreach().

По теме - все банально.

$company = Company::find($id); // ну или, если вы тут запрашиваете несколько компаний, добавьте with("contacts") чтобы запросов в базу было меньше

foreach($company->contacts as $contact){

echo $contact->name;
echo $contact->telephone;

}

Не в сети

#17 14.11.2014 07:57:46

Re: Связи

slider23 пишет:

Вы неправильно называете связи. Комментарии надо называть comments() , а контакты - contacts() - их же Many, несколько, и возвращается коллекция объектов, а не один объект. На работу это не влияет, но на понимание кода - влияет сильно. Вот вы, например, попались на эту семантическую ловушку в самом начале, когда запросили сие:

$posts = Post::all();
foreach($posts as $post) {
echo $post->comment->id;
}

$post->comment - это не один объект, у которого есть id, это коллекция. Если бы оно называлось comments , вы бы это заметили, и сделали по нему foreach().

По теме - все банально.

$company = Company::find($id); // ну или, если вы тут запрашиваете несколько компаний, добавьте with("contacts") чтобы запросов в базу было меньше

foreach($company->contacts as $contact){

echo $contact->name;
echo $contact->telephone;

}

Четко и ясно smile получилось с первого раза. Мой косяк что не объяснил задачу как надо.

Спасибо парни.

Не в сети

#18 12.12.2014 10:21:18

Re: Связи

Еще раз подниму тему.

Ест модель задач,связи.

 public function contacts()
    {
        return $this->hasOne('Contact','id_cont');
    }

    public function company()
    {

        return $this->hasOne('Company','id_com');
    }

таблица задач     

id
id_com
id_cont
start_date
end_date

где id_com и id_cont ид компании и задач

как мне теперь вытащит? по задачу данные компании и контакта?

Не в сети

#19 12.12.2014 10:41:06

Re: Связи

У Вас контакт и компания - это свойство задачи, судя по структуре БД. Соответственное, перепешите связи в модели задачи:

    public function contact()
    {
        return $this->belongsTo('Contact', 'id_cont');
    }


    public function company()
    {

        return $this->belongsTo('Company', 'id_com');
    }

Почитайте тщательно про логику ОРМ, её семантику, смысл, лексику - будет проще работать с Eloquent

Не в сети

#20 12.12.2014 12:15:08

Re: Связи

SMGladkovskiy пишет:

У Вас контакт и компания - это свойство задачи, судя по структуре БД. Соответственное, перепешите связи в модели задачи:

    public function contact()
    {
        return $this->belongsTo('Contact', 'id_cont');
    }


    public function company()
    {

        return $this->belongsTo('Company', 'id_com');
    }

Почитайте тщательно про логику ОРМ, её семантику, смысл, лексику - будет проще работать с Eloquent

Ок.

так не работает

  $task = Task::find(17); 

      foreach($task->contacts as $contacts){

           var_dump($contacts->contacts);

      }

мне надо еще на вюхе показывал всю задачу их компанию и контакта.

щяс он таком виде.

$tasks = $this->task->all();

 return \View::make('dashboard.tasks.taskslists', compact('tasks'));

и

@foreach ($tasks as $task)
				<tr>
                    <td><input name="checkboxlist" type="checkbox" value="{{{ $task->id }}}"></td>
					<td>{{{ $task->start_date }}}</td>
                    <td>{{{ $task->status() ? 'Статус1' : 'Статус2' }}}</td>

                    <td>{{{ $task->end_date }}}</td>
                    <td>{{ link_to_route('tasks.edit', 'Edit', array($task->id), array('class' => 'btn btn-info')) }}</td>
                    <td>
                        {{ Form::open(array('method' => 'DELETE', 'route' => array('tasks.destroy', $task->id))) }}
                            {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }}
                        {{ Form::close() }}
                    </td>
				</tr>
			@endforeach

мне не понятно какой запрос именно делать. как таком случай быть?

Не в сети

#21 12.12.2014 12:58:26

Re: Связи

Вы по-английски читать умеете?
Задача принадлежит контакту: Task belongs to Contact
Задача принадлежит компании: Task belongs to Company

Где Вы в этих предложениях увидели множественное число? Одна задача принадлежит одному контакту и компании. Соответственно, когда хотите получить эти данные, то и обращайтесь к соответствующим свойствам с учётом множественности числа:

$task->company;

Что ж Вы бездумно копируете то, что Вам предлагают сделать, не задумываясь о том, что это вообще такое? Что же за отношение к другим? Вы хотя бы себя уважайте (раз плюёте на других) и не задавайте одних и тех же вопросов, ответы на которые заложены в основах той тематики о которой спрашиваете, а вам посоветовали их (эти основы) почитать/изучить! Прилагайте усилия сами, уважайте чужое время!

Не в сети

#22 12.12.2014 13:31:48

Re: Связи

SMGladkovskiy пишет:

Вы по-английски читать умеете?
Задача принадлежит контакту: Task belongs to Contact
Задача принадлежит компании: Task belongs to Company

Где Вы в этих предложениях увидели множественное число? Одна задача принадлежит одному контакту и компании. Соответственно, когда хотите получить эти данные, то и обращайтесь к соответствующим свойствам с учётом множественности числа:

$task->company;

Что ж Вы бездумно копируете то, что Вам предлагают сделать, не задумываясь о том, что это вообще такое? Что же за отношение к другим? Вы хотя бы себя уважайте (раз плюёте на других) и не задавайте одних и тех же вопросов, ответы на которые заложены в основах той тематики о которой спрашиваете, а вам посоветовали их (эти основы) почитать/изучить! Прилагайте усилия сами, уважайте чужое время!

Что ты обижаешься. Ладно сам разберусь.

Не в сети

#23 12.12.2014 18:12:09

Wide

Re: Связи

companies
+ id
+ name

contacts
+ id
+ company_id
+ phone

tasks
+ id
+ company_id
+ name

class Company {

    function contact() {
        $this->hasOne('Contact');
    }
    
    function tasks() {
        $this->hasMany('Task');
    }
    
}
class Contact {

    function company() {
        $this->belongsTo('Company');
    }
    
}
class Task {

    function company() {
        $this->belongsTo('Company');
    }
    
}
$companies = Company::with('contact', 'tasks')->get();

foreach($companies as $company) {

    <article>
        <h2>#{{ $company->id }} - {{ $company->name }}</h2>
        <p>Контакты: {{ $company->contact->phone }}</p>
        <h3>Задачи</h3>
        <ul>
            foreach($company->tasks as $task) {
                <li>Задача #{{$task->id}} - {{ $task->name }}</li>
            }
        </ul>
    </article>

}
$contacts = Contact::with('company')->get();

foreach($contacts as $contact) {

    <li>Контакт #{{ $contact->id }} - {{ $contact->company->name }} - {{ $contact->phone }}</li>
    
}
$tasks = Task::with('company.contact')->get();

foreach($tasks as $task) {

    <li>Задача #{{ $task->id }} {{ $task->name }} - {{ $task->company->name }} - {{ $task->company->contact->phone }}</li>
    
}

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