Laravel有一个关系改变标识符值

时间:2014-04-08 14:52:59

标签: laravel laravel-4 eloquent

我不确定这是真正的关系。我会尝试解释我能做到的最好方法。

首先,我有三个模型: 公寓, AppartementPrice

AppartementPrice取决于: - appartement_id

我希望AppartementPrice可以像这样检索:

如果公寓有特定价格,则检索它,如果没有检索存储在数据库中的appartement_id = 0的所有公寓的价格。

基本上我想要的是做那样的事情:

    public function price()
    {
        if(isset($this->hasOne('AppartementPrice')->price) // Check that relation exists
            return $this->hasOne('AppartementPrice');
        else
            return $this->hasOne('AppartementPrice')->where('appartement_id', '0');
    }

但这不起作用。 它没有以默认价格回复我。 我想无论如何这不是最佳做法? 我首先尝试获取类似的信息:

//Check if appartment has a specific price or retrieve default
if($priceAppartement = AppartementPrice::getPriceByCompanyAppartement($this->id))
    return $priceAppartement;
else
    return AppartementPrice::getDefaultPrice();

但我有这个错误: 关系方法必须返回Illuminate \ Database \ Eloquent \ Relations \ Relation类型的对象 做的时候:

 echo $app->price->price;

如何检查是否存在关系?有没有办法像我描述的那样做?

谢谢

2 个答案:

答案 0 :(得分:2)

你无法取代这样的关系,因为你想要的不合逻辑 - 你想要检索不存在的关系。

相反,你可以这样做:

public function getPriceAttribute()
{
    return ($this->priceRelation) ?: $this->priceDefault();
}

public function priceDefault()
{
    // edit: let's cache this one so you don't call the query everytime
    // you want the price
    return AppartmentPrice::remember(5)->find(0);
}

public function priceRelation()
{
    return $this->hasOne('AppartementPrice');
}

然后你实现了你想要的目标:

$app->price; // returns AppartmentPrice object related or default one

但是,请注意,您无法正常处理这种关系:

$price = new AppartmentPrice([...]);
$app->price()->save($price); // will not work, instead use:
$app->priceRelation()->save($price);

答案 1 :(得分:0)

首先在Laravel 4中非常重要。

如果在查询关系时不使用括号,则表示您想要检索模型的Collention。 如果您想继续查询,必须使用括号。

例如:

// for getting prices collection (if not hasOne). (look like AppartementPrice)
$appartment->price;

// for getting the query which will ask the DB to get all
//price attached to this appartment, and then you can continue querying
$priceQuery = $appartment->price();

// Or you can chain your query
$appartment->price()->where('price', '>', 0)->get() // or first() or count();

其次,你的问题。

//Appartement Model

// This function is needed to keep querying the DB
public function price()
{
    return $this->hasOne('AppartementPrice')
}

// This one is for getting the appartment price, like you want to
public function getAppartmentPrice()
{
   $price_object = $this->price;
   if (!$price_object) // Appartment does not have any price {
      return AppartementPrice->where('appartement_id', '=', 0)->get();
   }
   return $price_object;
}