SQLSTATE [42S02]:找不到基表或视图laravel

So, going into the problem straight away. someone told me that we dont need to make a pivot table if we only want to have ids of the table. laravel can itself handle this situation. I dont know how this works. I have a table community and another table idea. relation is like this;

One community can contain many ideas and an idea can be found in many communities.

Relation in idea Model:

 public function community() {
        return $this->belongsToMany('App\Community')->withTimestamps();
    }

Relation in community Model:

 public function idea() {
        return $this->belongsToMany('App\idea');
    }

Now i want to fetch all the records related to a single community to show on its page Let's say the community is Arts.

Here is Controller function:

 public function showCommunities($id) {
    $community = Community::findOrFail($id)->community()->get();
    return view('publicPages.ideas_in_community', compact('community'));
   }

When i attach ->community()->get() to the Community::findOrFail($id) Then it throws the error

SQLSTATE[42S02]: Base table or view not found laravel

Any help would be appreciated.

Edit:

Logically, this piece of code Community::findOrFail($id)->community()->get() should be like this Community::findOrFail($id)->idea()->get(). Now it is true but it has little issue. it throws an error

Fatal error: Class 'App\idea' not found

The way you define the many-to-many relation looks ok - I'd just call them communities() and ideas(), as they'll return a collection of objects, not a single object.

Make sure you use correct class names - I can see you refering to your model classes using different case - see App\Community and App\idea.

In order to find related models, Eloquent will look for matching rows in the pivot table - in your case it should be named community_idea and have 3 fields: community_id, idea_id and autoincrement primary key id.

With that in place, you should be able to get all ideas linked to given community with:

$ideas = Community::findOrFail($communityId)->ideas;

If you need communities linked to given idea, just do:

$communities = Idea::findOrFail($ideaId)->communities;

You can read more about how to use many-to-many relationships here: https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

someone told me that we dont need to make a pivot table if we only want to have ids of the table

The above is not true (unless I've just misunderstood).

For a many-to-many (belongsToMany) their must be the two related table and then an intermediate (pivot) table. The intermediate table will contain the primary key for table 1 and the primary key for table 2.

In laravel, the convention for naming tables is plural for your main tables i.e. Community = 'communities' and Idea = 'ideas'. The pivot table name will be derived from the alphabetical order of the related model names i.e. community_idea.

Now, if you don't want/can't to follow these conventions that's absolutely fine. For more information you can refer to the documentation: https://laravel.com/docs/5.2/eloquent-relationships#many-to-many

Once you're happy that you have the necessary tables with the necessary fields you can access the relationship by:

$ideas = $community->ideas()->get();

//or

$ideas = $community->ideas;

So you controller would look something like:

public function showCommunities($id)
{
    $community = Community::findOrFail($id);

    //The below isn't necessary as you're passing the Model to a view
    // but it's good for self documentation

    $community->load('ideas');

    return view('publicPages.ideas_in_community', compact('community'));
}

Alternatively, you could add the ideas to the array of data passed to the view to be a bit more verbose:

public function showCommunities($id)
{
    $community = Community::findOrFail($id);

    $ideas = $community->ideas

    return view('publicPages.ideas_in_community', compact('community', 'ideas));
}

Hope this helps!

UPDATE

I would imagine the reason that you're receiving the App\idea not found is because the model names don't match. It's good practice (and in certain environments essential) to Capitalise you class names so make sure of the following:

  1. Your class name is Idea and it's file is called Idea.php
  2. The class has it's namespace declared i.e. namespace App;
  3. If you've added a new class and it's not being found you might need to run composer dump-autoload from the command line to update the autoloader.