Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Есть два моделя
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;
}
Так не работает,в чем дело?
Не в сети
Eager loading: пользуйте with('comments')
Не в сети
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)
Не в сети
Не в сети
А, у вас 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)
Не в сети
Однако ,если Вам нужны только id комментариев, то не проще ли идти от них:
$comments_ids = Comment::whereIn('post_id', $posts_ids)->lists('id');
Не в сети
Блин, так вопрос был - показать только данные коммента? Так в третьем сообщении у Вас и выводятся данные коммента. То, что они в json форматируются, так это от того, что коллекцию к строке приводите. Выведите нормально:
echo $post->comment->id;
echo $post->comment->comment;
echo $post->comment->post_id;
Не в сети
Блин, так вопрос был - показать только данные коммента? Так в третьем сообщении у Вас и выводятся данные коммента. То, что они в 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;
так не работает,ошибка. Даже стройный дебагер нету
Изменено Nelzz (13.11.2014 13:07:48)
Не в сети
Тогда проверяйте, как у Вас всё прописано в модели. Ну и ошибки покажите. А то никак не удаётся отрастить телепатические интерфейсы...
Изменено SMGladkovskiy (13.11.2014 13:15:19)
Не в сети
Тогда проверяйте, как у Вас всё прописано в модели. Ну и ошибки покажите. А то никак не удаётся отрастить телепатические интерфейсы...
Ну в модели,как на первом посте нечего лишнего,только связи и все. В общем поставил дебагер
ошибка Undefined property: Illuminate\Database\Eloquent\Collection::$id
Код
$posts = Post::with('comment')->get();
foreach($posts as $post) {
echo $post->comment->id;
Не в сети
Получился так
$posts = Post::with('comment')->get();
foreach($posts as $post) {
foreach($post->comment as $comment) {
echo $comment->id;
}
но как то тут все не чисто через двойной подбор делать. Может есть и другой способ.
Не в сети
Распишите нормально отношения:
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)
Не в сети
Распишите нормально отношения:
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делал пример с постом и коментом,так будет легче понятно и вам и мне. Мы на правильном пути
Изменено Nelzz (13.11.2014 16:17:01)
Не в сети
Что я хочу сделать сказал же "Через пост вытащит данные комента" Задача моя точно такая же,но в другом виде. Я специально cделал пример с постом и коментом,так будет легче понятно и вам и мне. Мы на правильном пути
Вы хотите вытащить данные коммента из коллекции постов? Какого именно коммента? какого именно поста? Какие граничные условия? Для чего именно это делается? Конкретно и предметно давайте, а то у Вас сферический конь в вакууме и Вы задаётесь вопросом, как далеко он улетит, если он наестся десятью кило гороха и пропердится...
Если задлача так и стоит - вывести все посты и все комменты к ним на одной странице, то именно перечислениями коллекций и отображением данных (через вьюшки), Вы данную задачу и решите.
Что именно у Вас не получается и какая именно задача перед Вам стоит? Я не спрашиваю, как Вы решили эту задачу решить, а именно первоначальные, так сказать, бизнес-требования. Например, "отобразить все комментарии к посту в списке с отображением даты, автора и содержания" - вот так.
Не в сети
Nelzz пишет:Что я хочу сделать сказал же "Через пост вытащит данные комента" Задача моя точно такая же,но в другом виде. Я специально cделал пример с постом и коментом,так будет легче понятно и вам и мне. Мы на правильном пути
Вы хотите вытащить данные коммента из коллекции постов? Какого именно коммента? какого именно поста? Какие граничные условия? Для чего именно это делается? Конкретно и предметно давайте, а то у Вас сферический конь в вакууме и Вы задаётесь вопросом, как далеко он улетит, если он наестся десятью кило гороха и пропердится...
Если задлача так и стоит - вывести все посты и все комменты к ним на одной странице, то именно перечислениями коллекций и отображением данных (через вьюшки), Вы данную задачу и решите.
Что именно у Вас не получается и какая именно задача перед Вам стоит? Я не спрашиваю, как Вы решили эту задачу решить, а именно первоначальные, так сказать, бизнес-требования. Например, "отобразить все комментарии к посту в списке с отображением даты, автора и содержания" - вот так.
Я лучше объясню суть задачи. У меня есть модели Компании и Контакта.
Модель Контакта тут только связь
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)
Не в сети
Вы неправильно называете связи. Комментарии надо называть 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;
}
Не в сети
Вы неправильно называете связи. Комментарии надо называть 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; }
Четко и ясно получилось с первого раза. Мой косяк что не объяснил задачу как надо.
Спасибо парни.
Не в сети
Еще раз подниму тему.
Ест модель задач,связи.
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 ид компании и задач
как мне теперь вытащит? по задачу данные компании и контакта?
Не в сети
У Вас контакт и компания - это свойство задачи, судя по структуре БД. Соответственное, перепешите связи в модели задачи:
public function contact()
{
return $this->belongsTo('Contact', 'id_cont');
}
public function company()
{
return $this->belongsTo('Company', 'id_com');
}
Почитайте тщательно про логику ОРМ, её семантику, смысл, лексику - будет проще работать с Eloquent
Не в сети
У Вас контакт и компания - это свойство задачи, судя по структуре БД. Соответственное, перепешите связи в модели задачи:
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
мне не понятно какой запрос именно делать. как таком случай быть?
Не в сети
Вы по-английски читать умеете?
Задача принадлежит контакту: Task belongs to Contact
Задача принадлежит компании: Task belongs to Company
Где Вы в этих предложениях увидели множественное число? Одна задача принадлежит одному контакту и компании. Соответственно, когда хотите получить эти данные, то и обращайтесь к соответствующим свойствам с учётом множественности числа:
$task->company;
Что ж Вы бездумно копируете то, что Вам предлагают сделать, не задумываясь о том, что это вообще такое? Что же за отношение к другим? Вы хотя бы себя уважайте (раз плюёте на других) и не задавайте одних и тех же вопросов, ответы на которые заложены в основах той тематики о которой спрашиваете, а вам посоветовали их (эти основы) почитать/изучить! Прилагайте усилия сами, уважайте чужое время!
Не в сети
Вы по-английски читать умеете?
Задача принадлежит контакту: Task belongs to Contact
Задача принадлежит компании: Task belongs to CompanyГде Вы в этих предложениях увидели множественное число? Одна задача принадлежит одному контакту и компании. Соответственно, когда хотите получить эти данные, то и обращайтесь к соответствующим свойствам с учётом множественности числа:
$task->company;
Что ж Вы бездумно копируете то, что Вам предлагают сделать, не задумываясь о том, что это вообще такое? Что же за отношение к другим? Вы хотя бы себя уважайте (раз плюёте на других) и не задавайте одних и тех же вопросов, ответы на которые заложены в основах той тематики о которой спрашиваете, а вам посоветовали их (эти основы) почитать/изучить! Прилагайте усилия сами, уважайте чужое время!
Что ты обижаешься. Ладно сам разберусь.
Не в сети
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>
}