Search code examples
laravelyajra-datatable

Table Bring all comments for one article using yajra/laravel-datatables


when try to get all comment for one Article by Article::first() but first() Bring just the first article i try use find() like

$comments = Article::find()-> commentsArticle()->with('articles');
return Datatables::of($comments)

i get error so how i can Pass a value to view all comments for one article or my be there is way without using find()

Article model

class Article extends Model{

 public $table = 'articles';

 public function commentsArticle() {
     return $this->hasMany('App\Comment');
     }

 }

controller

enter code here

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Yajra\Datatables\Datatables;

use App\Article;
use App\Comment;


class CommentController extends Controller{


   public function commentsForOne Article()
  {
    $comments = Article::all()->commentsArticle->with('articles');

            return Datatables::of($comments)->make(true);
  }

}

last error i get

ErrorException (E_DEPRECATED)
Non-static method Yajra\Datatables\Datatables::collection() should       
not be called statically

I hope find any idea or example like that will help me to learn


Solution

  • You are trying to get the first articles with its comments.

    public function commentsForOneArticle($id)
    {
        $article = Article::fine($id);
    
        //check if article exists to avoid errors
        if ( $article ) {
            return Datatables::of(Comment::where('article_id', $article->id))->make(true);
        }
    
        return "no article with id" . $id;
    }
    

    This was just an illustration. But it seems you need to understand first how Eloquent works. Watch this free Laracast https://laracasts.com/series/laravel-from-scratch-2017/episodes/7

    For routes, you can define the route like this:

    Route::get('comments/{article_id}', 'ArticleController@commentsForOneArticle');
    

    And call it in Ajax like

    $.ajax({url: "/comments/1", 
        success: function(result){
            //do stuff here
        },
        error: function(error) {
            console.log(error)
        }
    });
    

    All this is just a guide and not THE solution.

    Edit

    To take data with the user in one go

    $article = Article::with('user')->find($id);
    //will include all the fields from user and article
    

    Comments & author To get the name of the comment author, you need to define the relationship in comment model

    public function user() {
        return $this->belongsTo(User::class);
    }
    

    Then get like this

    if ( $article ) {
        return Datatables::of(Comment::with('users')->where('article_id', $article->id))->make(true);
    }