BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::toArray()'

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Decoding the Error: Why You Get 'Call to undefined method Illuminate\Database\Query\Builder::toArray()' in Laravel Tinker

As a senior developer, I’ve seen countless developers run into cryptic errors while exploring the powerful ecosystem of Laravel. When you are deep into learning concepts—like those covered in the @Jeffrey_way series on Many-to-Many Relations—it's easy to assume the code should work, leading to frustration when an unexpected exception pops up.

The error you are encountering, BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::toArray()', is a classic Laravel stumbling block. It signals a mismatch between what you think a database query builder object can do and what it actually is capable of doing when you try to call a specific method on it.

Let’s dive deep into why this happens, how the Query Builder functions, and the correct Eloquent approach for retrieving relationship data.

Understanding the Laravel Query Builder vs. Eloquent Models

The core of this issue lies in understanding the distinction between the underlying query mechanism (the Builder) and the application layer abstraction (the Eloquent Model).

When you execute a query using methods like where(), with(), or join() on an Eloquent model, Laravel translates those calls into instructions for the underlying SQL query builder. The result of these operations is a Builder instance.

The method toArray() is typically a convenience method found on Eloquent Models or Collections, designed to convert the fetched result set into a standard PHP associative array. However, when you try to call it directly on an intermediate Builder object, Laravel correctly throws an error because that specific object doesn't possess that method by default.

The Scenario Breakdown

Based on your context, you are likely attempting something along the lines of:

php
$article->tags()->toArray(); // This results in the error

or perhaps trying to call it directly on a query result obtained from Tinker:

php
$query = Article::where('id', 1)->with('tags');
$result = $query->toSql(); // Or some other intermediate step
// ... then attempting to call toArray() on the builder object itself.

The error confirms that Illuminate\Database\Query\Builder does not have a public method named toArray(). This is expected because the Builder's job is to construct the SQL query; it doesn't hold the final result set structure directly in an array format.

The Correct Approach: Retrieving Relationship Data

To correctly retrieve data from a relationship (like tags for an article), you must interact with the Eloquent Model, which handles the execution and hydration of the results.

Solution 1: Using Eloquent Relationships Correctly

If you have loaded a model instance that has a relationship, you access that relationship through the model methods. To get the related items as an array, you usually need to iterate over the collection or use the specific accessor methods provided by Eloquent.

Here is the idiomatic way to fetch tags for an article, assuming your setup follows Laravel best practices outlined on platforms like Laravel Company:

php
use App\Models\Article;

// 1. Fetch the article
$article = Article::find(1);

if ($article) {
    // 2. Access the relationship (this returns a Collection)
    $tagsCollection = $article->tags;

    // 3. Convert the collection to an array
    $tagsArray = $tagsCollection->toArray();

    // Or, if you just want the tag names as strings:
    $tagNames = $tagsCollection->pluck('name');
}

Notice that we call toArray() on $tagsCollection (which is an Eloquent Collection), not on the underlying $article->tags() query builder object. This correctly leverages the methods available on the collection objects, ensuring data integrity and avoiding method call errors.

Best Practice: Using with() for Eager Loading

For performance, especially when dealing with Many-to-Many relations, always use eager loading via the with() method when fetching parent models. This prevents the N+1 query problem, which is a critical concept in optimizing database interactions, as emphasized by Laravel's design principles.

php
// Eager load tags to prevent N+1 queries
$articles = Article::with('tags')->get(); 

Conclusion

The BadMethodCallException is not an error in your logic itself, but rather a pointer indicating that you are trying to use a method intended for the result set (like toArray()) on the query construction object (Builder). By shifting your focus from manipulating the raw Builder object to interacting with the hydrated Eloquent Model or the resulting Collection, you align with Laravel’s design philosophy and resolve this issue cleanly. Always remember that Eloquent models provide the necessary methods to make data retrieval intuitive and safe.