php - Updating timestamps on attaching/detaching Eloquent relations -
i'm using laravel 4, , have 2 models:
class asset extends \eloquent { public function products() { homecoming $this->belongstomany('product'); } } class product extends \eloquent { public function assets() { homecoming $this->belongstomany('asset'); } }
product
has standard timestamps on (created_at
, updated_at
) , i'd update updated_at
field of product
when attach/detach asset
.
i tried on asset
model:
class asset extends \eloquent { public function products() { homecoming $this->belongstomany('product')->withtimestamps(); } }
...but did nil @ (apparently). edit: apparently updating timestamps on pivot table, not updating them on relation's own table (ie. updates assets_products.updated_at
, not products.updated_at
).
i tried on asset
model:
class asset extends \eloquent { protected $touches = [ 'products' ]; public function products() { homecoming $this->belongstomany('product'); } }
...which works, breaks seed calls asset::create([ ... ]);
because apparently laravel tries phone call ->touchowners()
on relation without checking if it's null
:
php fatal error: phone call undefined method illuminate\database\eloquent\collection::touchowners() in /projectdir/vendor/laravel/framework/src/illuminate/database/eloquent/model.php on line 1583
the code i'm using add/remove asset
s this:
product::find( $validid )->assets()->attach( $anothervalidid ); product::find( $validid )->assets()->detach( $anothervalidid );
where going wrong?
you can manually using touch
method:
$product = product::find($validid); $product->assets()->attach($anothervalidid); $product->touch();
but if don't want manually each time can simplify creating method in product
model way:
public function attachasset($id) { $this->assets()->attach($id); $this->touch(); }
and can utilize way:
product::find($validid)->attachasset($anothervalidid);
the same can of course of study detach action.
and noticed have 1 relation belongstomany
, other hasmany
- should rather belongstomany
in both because it's many many relationship
edit
if utilize in many models, create trait or create base of operations class extends eloquent next method:
public function attach($id, $relationship = null) { $relationship = $relationship ?: $this->relationship; $this->{$relationship}()->attach($id); $this->touch(); }
now, if need functionality need extend base of operations class (or utilize trait), , can add together product
class 1 property:
private $relationship = 'assets';
now use:
product::find($validid)->attach($anothervalidid);
or
product::find($validid)->attach($anothervalidid, 'assets');
if need attach info updating updated_at
field. same of course of study need repeat detaching.
php laravel eloquent
No comments:
Post a Comment