I have two models Document(having name as one of the columns) and ApplicationDocument. ApplicationDocument contains the foreign key (docucument_id). I want to fetch records from documents that are related to the applicationDocument and also match the name criteria.
My relationship looks like this in ApplicationDocument
public function document() { return $this->belongsTo('AppModelsDocument', 'doc_id'); }
And looks like this in Document:
public function applicationDocument() { return $this->hasMany('AppModelsApplicationDocument'); }
And my query looks like this:
$previousDoc= Document::whereHas('applicationDocument', function (Builder $query) { $query->where('application_id', $appID); })->where('name', $name)->get();
My query is throwing errors. What am I missing please?
Advertisement
Answer
These code is in trait, you are using Type hinting. However, laravel will assuming the namespace of Builder
is AppTraits
. So the error occurs.
You can add this line at the top of your trait:
use IlluminateDatabaseEloquentBuilder;
or remove type-hinting Builder
.
And by convention, Eloquent will take the “snake case” name of the owning model and suffix it with _id
. So by default eloquent will assuming the foreign_key is document_id
. However, the foreign_key is doc_id
, so you need to specify it.
For ApplicationDocument:
public function document() { return $this->belongsTo('AppModelsDocument', 'doc_id'); }
For Document, recommend to use plural method name:
public function applicationDocuments() { return $this->hasMany('AppModelsApplicationDocument', 'doc_id', 'id'); }
Apply use($appID)
for injecting the $appID
to closure.
$previousDoc= Document::whereHas('applicationDocuments', function (Builder $query) use ($appID) { $query->where('application_id', $appID); })->where('name', $name)->get();