Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5.5] Make pivot model instantiable #20179

Merged
merged 3 commits into from
Jul 20, 2017
Merged

[5.5] Make pivot model instantiable #20179

merged 3 commits into from
Jul 20, 2017

Conversation

BertvanHoekelen
Copy link
Contributor

I was facing the same problems as described in #17770.

When I added a hasOne relation to the pivot model, it was not able to construct the pivot instance on the inverse side of the relation. This PR makes the pivot model behave more like a regular model so it can be instantiated without the need of the pivot attributes.

@taylorotwell
Copy link
Member

Paste an entire example of how to recreate this in Laravel.

@BertvanHoekelen
Copy link
Contributor Author

BertvanHoekelen commented Jul 19, 2017

See http://github.com/bertvanhoekelen/pivot-model-example.

This test will throw the following exception:

Too few arguments to function Illuminate\Database\Eloquent\Relations\Pivot::__construct(), 0 passed in laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php on line 506 and at least 3 expected

City.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
    protected $guarded = [];

    public function products()
    {
        return $this->belongsToMany(Product::class)->withPivot(['id'])->using(CityProduct::class);
    }
}

Product.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $guarded = [];

    public function cities()
    {
        return $this->belongsToMany(City::class)->withPivot(['id'])->using(CityProduct::class);
    }
}

CityProduct.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class CityProduct extends Pivot
{
    public function city()
    {
        return $this->belongsTo(City::class);
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function order()
    {
        return $this->hasOne(Order::class);
    }
}

Order.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $guarded = [];

    public function cityProduct()
    {
        return $this->belongsTo(CityProduct::class);
    }
}

PivotModelIsNotInstantiableTest.php

<?php

namespace Tests\Unit;

use App\City;
use App\Order;
use App\Product;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class PivotModelIsNotInstantiableTest extends TestCase
{
    use DatabaseMigrations;

    /** @test */
    public function pivot_model_is_not_instantiable()
    {
        $city = City::create(['name' => 'Amsterdam']);
        $product = Product::create(['name' => 'Burger']);
        $city->products()->attach($product->id);

        $cityProduct = $city->products()->first()->pivot;

        $order = Order::create(['city_product_id' => $cityProduct->id]);

        $this->assertEquals($cityProduct->id, $order->cityProduct->id);
    }
}

@taylorotwell
Copy link
Member

Thanks

@taylorotwell taylorotwell merged commit 06f01cf into laravel:master Jul 20, 2017
@BertvanHoekelen BertvanHoekelen deleted the bugfix/17770-pivot-model-can-be-instantiated branch July 20, 2017 14:59
@Raulebc
Copy link

Raulebc commented Jun 26, 2018

This way to make relationship is working? or there is other way?

@mazyvan
Copy link

mazyvan commented Dec 23, 2018

I'm facing this problem right now. I love its solved, but I'm using 5.4 dammit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants