[PHP] detach() functie niet bescikbaar binnen Eloquent model

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
In mijn Laravel project, heb ik in het admin gedeelte uiteraard ook een user 'module' zitten, in zijn eigen (resource) controller. Bij de delete functie gaat er naar mijn idee iets niet goed, maar kan niet vinden wat er is.

Voor de user model, heb ik een relatie gemaakt, die de roles van de user ophaalt. Bij het verwijderen van een user, moeten deze roles ook verwijderd (opgeschoont) worden. Nu kan ik er wel omheen gaan werken, maar lijkt mij het mooiste om dat te doen met de standaard functies die er al zijn. Mijn delete functie is als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function destroy($id) {
    if($id == Auth::user()->id) {
        Flash::error('Je kunt jezelf niet verwijderen!');

        return redirect()->route('admin.user.index');
    } else {
        $user = User::findOrFail($id);

        // Roles verwijderen bij de user
        if(count($user->roles()) > 0) {
            $user->roles()->detach();    
        }
        
        // User zelf verwijderen
        $user->delete();
    }
}
In het user model is de roles relatie als volgt aangelegd
PHP:
1
2
3
public function roles() {
    return $this->belongsToMany('App\Role', 'role_users');
}
Volgens de documentatie hoort de detach() functie namelijk bij de belongsToMany method van Eloquent en zou het dus moeten werken. Ik krijg echter als error dat de method detach() niet bestaat?

Door de documentatie en vragen op o.a. Stackoverflow begrijp ik dat dat wel het geval zou moeten zijn, maar is dat bij mij in deze dus niet. Ik gebruik de nieuwste versie van Laravel 5.2 (gisteren met composer update gedraaid).

[ Voor 4% gewijzigd door CH4OS op 10-06-2016 10:53 ]

Beste antwoord (via CH4OS op 11-06-2016 14:41)


  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Wat mij als buitenstaander opvalt:

in Builder.php line 2345
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Builder.php line 1422
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Relation.php line 343
at Relation->__call('detach', array()) in UserController.php line 144
at HasMany->detach() in UserController.php line 144
at UserController->destroy('5')
at call_user_func_array(array(object(UserController), 'destroy'), array('user' => '5')) in compiled.php line 9379

Terwijl:
PHP:
1
2
3
public function roles() {
    return $this->belongsToMany('App\Role', 'role_users');
}


BelongsToMany heeft inderdaad een detach(), daar waar HasMany dat niet heeft. Ergens iets niet goed met de relaties? Of wellicht tegen het verkeerde object aan het babbelen?

[ Voor 3% gewijzigd door Feanathiel op 11-06-2016 12:40 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 14:02
Wat return $user->roles(), als je die met print_r checkt, lijkt me goede eerste stap voor debugging. Ik ken laravel verder niet, maar in mijn ervaring is kijken wat je er uit krijgt voordat je op een error komt erg behulpzaam :)

|>


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Zit stiekem even vanaf mijn werk (<3 Git, hahaha!), een $user->roles() returned het volgende vanuit dd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
BelongsToMany {#384 &#9660;
  #table: "role_users"
  #foreignKey: "user_id"
  #otherKey: "role_id"
  #relationName: "roles"
  #pivotColumns: []
  #pivotWheres: []
  #pivotCreatedAt: null
  #pivotUpdatedAt: null
  #query: Builder {#381 &#9654;}
  #parent: User {#385 &#9654;}
  #related: Role {#378 &#9654;}
}
Ik krijg dus een Illuminate\Database\Eloquent\Relations\BelongsToMany Object terug.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 14:02
Hmm, volgens;
https://laravel.com/api/5...ations/BelongsToMany.html

Is het wel een functie er van, wat is de exacte error die je terug krijgt?

|>


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
De foutmelding die ik krijg is de volgende:
BadMethodCallException in Builder.php line 2345:
Call to undefined method Illuminate\Database\Query\Builder::detach()
, wat extra debugging info, wellicht handig:
in Builder.php line 2345
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Builder.php line 1422
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Relation.php line 343
at Relation->__call('detach', array()) in UserController.php line 144
at HasMany->detach() in UserController.php line 144
at UserController->destroy('5')
at call_user_func_array(array(object(UserController), 'destroy'), array('user' => '5')) in compiled.php line 9379
Ik zie het niet echt, wat ik fout zou doen. :(

Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 152% gewijzigd door Firefly III op 21-10-2019 09:22 . Reden: Leeg ivm privacy ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Dat maakt voor het uiteindelijk detachen toch niet uit, daar struikeld het script op, omdat de method niet zou bestaan? :)

Ik heb namelijk zonder de check er omheen er ook last van. Delete ik een user die wél roles heeft toebedeeld gekregen, gaat het ook fout, dan bestaat de method ook niet.

[ Voor 57% gewijzigd door CH4OS op 10-06-2016 11:24 ]


Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 100% gewijzigd door Firefly III op 21-10-2019 09:22 . Reden: Leeg ivm privacy ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
JCE schreef op vrijdag 10 juni 2016 @ 11:22:
Als het er inderdaad nul zijn valt er niks te detachen wellicht?
Lijkt me dat de method dan wel zou moeten bestaan? Ook bij users die wel roles toebedoeld hebben gekregen gaat het fout, met dezelfde foutmelding.

Acties:
  • 0 Henk 'm!

  • Chris7
  • Registratie: Maart 2011
  • Niet online
CH40S schreef op vrijdag 10 juni 2016 @ 11:25:
[...]
Lijkt me dat de method dan wel zou moeten bestaan? Ook bij users die wel roles toebedoeld hebben gekregen gaat het fout, met dezelfde foutmelding.
De error is Call to undefined method Illuminate\Database\Query\Builder::detach(). Oftewel je roept detach() niet aan op een BelongsToMany, maar op een Query\Builder. Dus zit ervoor al een fout. De method is er wel, alleen niet op de Builder class.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Chris7 schreef op vrijdag 10 juni 2016 @ 11:35:
De error is Call to undefined method Illuminate\Database\Query\Builder::detach(). Oftewel je roept detach() niet aan op een BelongsToMany, maar op een Query\Builder. Dus zit ervoor al een fout. De method is er wel, alleen niet op de Builder class.
Hmmm, vreemd dat de documentatie wel aangeeft dat het zo zou moeten dan? :? En zoals eerder aangegeven (CH40S in "[PHP] detach() functie niet bescikbaar binnen Eloquent model") is $user->roles() wel degelijk een BelongsToMany object? :?

Lijkt er trouwens op, dat de sync() functie ook niet helemaal goed meer gaat, maar daarvoor heb ik nog even te weinig info (en tijd) om dat uit te zoeken. Ik denk dat er dus wel wat meer aan de hand is, binnen Laravel zelf, eigenlijk.

[ Voor 38% gewijzigd door CH4OS op 10-06-2016 12:11 ]


Acties:
  • 0 Henk 'm!

  • Oid
  • Registratie: November 2002
  • Niet online

Oid

Hier gebruiken ze 'find', jij gebruikt 'findorfail'.

de methodes worden allebei anders afgehandeld: https://github.com/laravel/framework/issues/1028 (komt uit 2013 dus weet niet hoe relevant)

Je kan het eens proberen?

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 12:37

Ventieldopje

I'm not your pal, mate!

Oid schreef op vrijdag 10 juni 2016 @ 14:06:
[...]


Hier gebruiken ze 'find', jij gebruikt 'findorfail'.

de methodes worden allebei anders afgehandeld: https://github.com/laravel/framework/issues/1028 (komt uit 2013 dus weet niet hoe relevant)

Je kan het eens proberen?
Zoals ook in het issue wordt genoemd, gebruik firstOrFail, wel even een find doen natuurlijk ;) Ze noemen daar overigens ook dat ze findOrFail naar Builder willen verplaatsen, of dat gebeurd is weet ik niet maar dat zou misschien wel verklaren waarom hij klaagt dat de method niet beschikbaar is in de Builder class.

[ Voor 23% gewijzigd door Ventieldopje op 10-06-2016 14:36 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Ventieldopje schreef op vrijdag 10 juni 2016 @ 14:34:
Zoals ook in het issue wordt genoemd, gebruik firstOrFail, wel even een find doen natuurlijk ;) Ze noemen daar overigens ook dat ze findOrFail naar Builder willen verplaatsen, of dat gebeurd is weet ik niet maar dat zou misschien wel verklaren waarom hij klaagt dat de method niet beschikbaar is in de Builder class.
Helaas, gebruik ik firstOrFail ipv findOrFail, dan gaat het ook niet goed. Overigens ook met find($id) gaat het niet goed.

In concreto: het maakt niet uit of find, findOrFail of firstOrFail gebruikt wordt; het geeft hoe dan ook de error.

EDIT:
Ook even een find($id)->firstOrFail() gedaan, maar dat gaat dus ook niet goed.

EDIT2:
Gebruik ik
PHP:
1
$user = User::firstOrFail([$id => 'id']);
om de user op te halen, dan gaat het ook niet goed, ook dan komt de melding dat de detach() method niet bestaat. Ik ga er hoe langer hoe meer er vanuit dat dit een bug is binnen Laravel.

Heb voor de zekerheid ook maar even een issue op Github aangemaakt, ik ben benieuwd.

[ Voor 74% gewijzigd door CH4OS op 10-06-2016 15:37 ]


Acties:
  • 0 Henk 'm!

  • tommieonos
  • Registratie: Oktober 2011
  • Laatst online: 09:52
Het probleem zit in de haakjes:

code:
1
$user->roles()
geeft een Builder terug, maar
code:
1
$user->roles
geeft een BelongsToMany. Een typisch geval van Laravel kunsten.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
tommieonos schreef op zaterdag 11 juni 2016 @ 11:02:
Het probleem zit in de haakjes:

code:
1
$user->roles()
geeft een Builder terug, maar
code:
1
$user->roles
geeft een BelongsToMany. Een typisch geval van Laravel kunsten.
Wat ook een error geeft:
BadMethodCallException in Macroable.php line 81: Method detach does not exist.
Helaas, dus.

EDIT:
Sterker nog; het is zelfs andersom, dat heb ik zojuist getest.
PHP:
1
$user->roles
geeft dus een object van collection terug, waarin sowieso geen detach() method zit.
PHP:
1
$user->roles()
geeft een object van BelongsToMany terug (wat ik dus nodig heb), waarin de functie zou moeten zitten, maar dat blijkbaar dus niet meer doet.

[ Voor 34% gewijzigd door CH4OS op 11-06-2016 11:16 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Wat mij als buitenstaander opvalt:

in Builder.php line 2345
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Builder.php line 1422
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Relation.php line 343
at Relation->__call('detach', array()) in UserController.php line 144
at HasMany->detach() in UserController.php line 144
at UserController->destroy('5')
at call_user_func_array(array(object(UserController), 'destroy'), array('user' => '5')) in compiled.php line 9379

Terwijl:
PHP:
1
2
3
public function roles() {
    return $this->belongsToMany('App\Role', 'role_users');
}


BelongsToMany heeft inderdaad een detach(), daar waar HasMany dat niet heeft. Ergens iets niet goed met de relaties? Of wellicht tegen het verkeerde object aan het babbelen?

[ Voor 3% gewijzigd door Feanathiel op 11-06-2016 12:40 ]


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 12:37

Ventieldopje

I'm not your pal, mate!

Feanathiel schreef op zaterdag 11 juni 2016 @ 12:38:
Wat mij als buitenstaander opvalt:

in Builder.php line 2345
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Builder.php line 1422
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Relation.php line 343
at Relation->__call('detach', array()) in UserController.php line 144
at HasMany->detach() in UserController.php line 144
at UserController->destroy('5')
at call_user_func_array(array(object(UserController), 'destroy'), array('user' => '5')) in compiled.php line 9379

Terwijl:
PHP:
1
2
3
public function roles() {
    return $this->belongsToMany('App\Role', 'role_users');
}


BelongsToMany heeft inderdaad een detach(), daar waar HasMany dat niet heeft. Ergens iets niet goed met de relaties? Of wellicht tegen het verkeerde object aan het babbelen?
Dat verklaart enigszins wat maar dan zou firstOrFail (ook een App\Role als het goed is) wél een detach moeten hebben toch? Aangezien het de andere kant van de relatie is.

offtopic:
Hadden ze niet gewoon beter Doctrine kunnen gebruiken daar bij Laravel? :+

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Feanathiel schreef op zaterdag 11 juni 2016 @ 12:38:
Wat mij als buitenstaander opvalt:

in Builder.php line 2345
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Builder.php line 1422
at Builder->__call('detach', array())
at Builder->detach()
at call_user_func_array(array(object(Builder), 'detach'), array()) in Relation.php line 343
at Relation->__call('detach', array()) in UserController.php line 144
at HasMany->detach() in UserController.php line 144
at UserController->destroy('5')
at call_user_func_array(array(object(UserController), 'destroy'), array('user' => '5')) in compiled.php line 9379

Terwijl:
PHP:
1
2
3
public function roles() {
    return $this->belongsToMany('App\Role', 'role_users');
}


BelongsToMany heeft inderdaad een detach(), daar waar HasMany dat niet heeft. Ergens iets niet goed met de relaties? Of wellicht tegen het verkeerde object aan het babbelen?
Scherp! hasMany heeft inderdaad geen detach() functie, BelongsToMany heeft dat wel. Ik heb het ook gelijk even doorgegeven in het issue, lijkt er dus steeds meer op, dat het een bug is, lijkt me? :)

EDIT:
Het is opgelost. Ik heb wederom gecontroleerd op een update en er was inderdaad een update naar 5.2.37 beschikbaar (en ik had gisteravond ook nog gecontroleerd en zat toen op 5.2.36). Had eerst een klein foutje, omdat ik nog $user->roles->detach deed, dat aangepast naar $user->roles()->detach() en nu werkt het wel.

[ Voor 11% gewijzigd door CH4OS op 11-06-2016 13:55 ]


Acties:
  • 0 Henk 'm!

  • Chris7
  • Registratie: Maart 2011
  • Niet online
CH40S schreef op zaterdag 11 juni 2016 @ 13:29:
[...]
Scherp! hasMany heeft inderdaad geen detach() functie, BelongsToMany heeft dat wel. Ik heb het ook gelijk even doorgegeven in het issue, lijkt er dus steeds meer op, dat het een bug is, lijkt me? :)
Dat is geen bug, omdat detach() alleen werkt op many-to-many relationships. Dat staat ook in de documentatie die je hebt gelinkt:
When working with many-to-many relationships, Eloquent provides [...]

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Ik had alles ook wel goed (ook conform de documentatie), de relatie is bijvoorbeeld belongsToMany, wat een many-to-many relationship is, toch werd om mij onduidelijke redenen hasMany gebruikt ipv BelongsToMany en dat is waar uiteindelijk de (Laravel interne) bug zat.

Ik heb geupdate naar Laravel 5.2.37 (zat op 5.2.36) en nu werkt het wél, zonder dat ik (uiteindelijk) code aangepast heb. Het was dus wel degelijk een bug die er in geslopen was. ;)

[ Voor 12% gewijzigd door CH4OS op 11-06-2016 14:05 ]


Acties:
  • 0 Henk 'm!

  • Chris7
  • Registratie: Maart 2011
  • Niet online
CH40S schreef op zaterdag 11 juni 2016 @ 14:04:
[...]
Ik had alles ook wel goed (ook conform de documentatie), de relatie is bijvoorbeeld belongsToMany, wat een many-to-many relationship is, toch werd om mij onduidelijke redenen hasMany gebruikt ipv BelongsToMany en dat is waar uiteindelijk de (Laravel interne) bug zat.

Ik heb geupdate naar Laravel 5.2.37 (zat op 5.2.36) en nu werkt het wél, zonder dat ik (uiteindelijk) code aangepast heb. Het was dus wel degelijk een bug die er in geslopen was. ;)
Ah, ik begreep je reactie verkeerd, dacht dat je bedoelde dat het een bug is dat hasMany geen detach functie heeft. Dan was het inderdaad een fout in het framework, gelukkig is 't nu gefixt :).
Pagina: 1