2

I am trying to get a hasMany of hasMany using jenssegers-mongodb library.

Website model:

use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\SoftDeletes;
use Jenssegers\Mongodb\Eloquent\HybridRelations;

class Website extends Model
{
    use HybridRelations, SoftDeletes, Sluggable;

    protected $connection = 'mysql';

    protected $dates = ['created_at', 'updated_at'];

    protected $fillable = ['name', 'link', 'slug'];

    public function visitors()
    {
        return $this->hasMany(Visitor::class, 'website_id', 'id');
    }

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable(): array
    {
        return [
            'slug' => [
                'source' => 'name'
            ]
        ];
    }
}

Visitor model:

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Jenssegers\Mongodb\Eloquent\SoftDeletes;

class Visitor extends Eloquent
{
    use SoftDeletes;

    protected $connection = 'mongodb';

    protected $dates = ['created_at', 'updated_at'];

    protected $fillable = ['uid', 'ip', 'deviceInfo', 'location', 'currentPage', 'currentSection', 'created_at', 'updated_at'];

    public function campaigns()
    {
        return $this->hasMany(Campaign::class);
    }

    public function clicks()
    {
        return $this->hasMany(Click::class, 'tracking_id', '_id');
    }

    public function visits()
    {
        return $this->hasMany(Visit::class);
    }
}

Click model:

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Jenssegers\Mongodb\Eloquent\SoftDeletes;

class Click extends Eloquent
{
    use SoftDeletes;

    protected $connection = 'mongodb';

    protected $dates = ['created_at', 'updated_at'];

    protected $fillable = ['page', 'section', 'click', 'count', 'created_at', 'updated_at'];

    public function tracking()
    {
        return $this->belongsTo(Tracking::class);
    }
}

I am able to get $website->visitors but not $website->visitors()->clicks(). Also I need to perform some aggregation on these clicks.

Error Received:

BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::clicks does not exist. in file /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php on line 103

#0 /Applications/MAMP/htdocs/tracking-admin/backend/app/Repositories/Website/WebsiteRepository.php(114): Illuminate\Support\Collection->__call('clicks', Array)
#1 /Applications/MAMP/htdocs/tracking-admin/backend/app/Http/Controllers/WebsiteController.php(116): App\Repositories\Website\WebsiteRepository->collectiveClickData('localhost')
#2 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\WebsiteController->collectiveClickData(Object(App\Http\Requests\Website\ValidateDelete), 'localhost')
#3 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('collectiveClick...', Array)
#4 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(254): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\WebsiteController), 'collectiveClick...')
#5 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(197): Illuminate\Routing\Route->runController()
#6 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(693): Illuminate\Routing\Route->run()
#7 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#8 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(127): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(63): Illuminate\Routing\Middleware\ThrottleRequests->handleRequest(Object(Illuminate\Http\Request), Object(Closure), Array)
#12 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Routing\Middleware\ThrottleRequests->handle(Object(Illuminate\Http\Request), Object(Closure), '60', '1')
#13 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(44): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#14 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure), 'api')
#15 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#16 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(695): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#17 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(670): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#18 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(636): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#19 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(625): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#20 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(166): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#21 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#22 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#23 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#24 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#26 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#27 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
#28 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))
#30 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/fruitcake/laravel-cors/src/HandleCors.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#31 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
#32 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#33 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
#34 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#35 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(141): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#36 /Applications/MAMP/htdocs/tracking-admin/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(110): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#37 /Applications/MAMP/htdocs/tracking-admin/backend/public/index.php(55): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
Pritam Kadam
  • 3,203
  • 4
  • 19
  • 41
  • what you are looking for is I guess hasManyThrough() but jenssegers doesn't provide hasmanythrough, take the get instance & use it to form the hasManyThrough relation, it will satisfy the needs of the question – bhucho Feb 05 '21 at 07:56
  • Can you please tell how you're querying the `Website` Model – Haridarshan May 22 '21 at 16:31

0 Answers0