I am learning laravel and trying to create a community with laravel. I stuck at some part and need to ask you guys.
Right now I am trying to displaying posts to reader.
This is what i accomplish so far
with this code :
public $restful = true;
public function get_index($title = '')
{
//Do we have an arguement?
if(empty($title))
{return Redirect::to('dashboard');}
$view = View::make('entry');
$query = DB::table('threads')->where('title', '=', $title)->first();
//Do we have this thread?
if(!$query)
{return Redirect::to('entry/suggest');}
//We have? so lets rock it!
$view->title = $query->title; //we get the title.
$thread_id = $query->id;
//getting posts.
$posts = DB::table('posts')->where('thread_id', '=', $thread_id)->get();
$view->posts = $posts;
return $view;
}
and the view is :
<div id="entrybox">
<h2>{{$title}}</h2>
@foreach($posts as $post)
<p class="entry"><span class="entrynumber">1</span><span class="entry_text">{{$post->post_entry}}</span></p>
<p align="right" class="edate"><span class="entry_user">{post_row.POST_USERNAME}</span> <span class="entry_date">{post_row.DATE}</span></p>
@endforeach
</div>
But the hard part(for me) is integrate posts with poster's username or other user info like e-mail for moderate privileges. However hey are in 'users' table.
Lets say $posts variable holds data of 10 posts for a thread *a post has thread_id , poster_userid, post, posted_date.
How can i grab username from 'users' table and send it to my view? I am sure i need to use foreach after selecting posts from database I just dont know how to handle arrays in foreach.
Look up how to set up models and their relationships using Eloquent ORM: http://laravel.com/docs/database/eloquent
Specifically http://laravel.com/docs/database/eloquent#relationships
You should have three models, Thread, Post and User (change poster_userid to user_id... or you can keep it but I wouldn't suggest it... just keep things simple. You could also use author_id or maybe even poster_id if that floats your boat.. just be sure to change 'user_id' out with what you choose)
//application/models/User.php
class User extends Eloquent {
public function posts()
{
return $this->has_many('Post', 'user_id');
}
}
and
//application/models/Post.php
class Post extends Eloquent {
public function author()
{
return $this->belongs_to('User', 'user_id');
}
public function thread()
{
return $this->belongs_to('Thread', 'thread_id');
}
}
and
//application/models/Thread.php
class Thread extends Eloquent {
public function posts()
{
return $this->has_many('Post', 'thread_id');
}
}
and instead of
$query = DB::table('threads')->where('title', '=', $title)->first();
//Do we have this thread?
if(!$query)
{return Redirect::to('entry/suggest');}
//We have? so lets rock it!
$view->title = $query->title; //we get the title.
$thread_id = $query->id;
//getting posts.
$posts = DB::table('posts')->where('thread_id', '=', $thread_id)->get();
I would just put
$thread = Thread::where('title', '=', $title)->first();
if(!$query)
{return Redirect::to('entry/suggest');}
$posts = $thread->posts()->get();
//or if you want to eager load the author of the posts:
//$posts = $thread->posts()->with('author')->get();
Then in your view you can look up the user's name by the following:
$post->author->username;
Easy peezy.
With Eloquent you can do this in multiple ways.
First, you can add a method to your post model that retrieves the related data. This approach will create a new query for each post, so it's normally not the best choice.
class Post extends Eloquent
{
public function user()
{
return $this->has_one('User');
}
}
Second, you can modify your initial query to join your desired data and avoid creating undo queries. Know as "Eager Loading".
// Example from Laravel.com
foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}