我不确定这是真正的关系。我会尝试解释我能做到的最好方法。
首先,我有三个模型: 公寓, 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;
如何检查是否存在关系?有没有办法像我描述的那样做?
谢谢
答案 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;
}