【发布时间】:2019-05-10 06:36:29
【问题描述】:
我正在尝试了解如何有效地使用 Eloquent 关系在模型中拥有一些高级功能。 我有一个包含 2 个表“用户”和“订阅”的订阅应用程序。 这是一个遗留系统,所以我不能随意更改。
Table users (model App\User)
id
email
active (0/1)
join_date
address etc
phone
Table subscriptions (model App\Subscription)
id
user_id
box_id (what the person is subscribed to get)
amount
用户被标记为活跃或不活跃。
我想在订阅模型上有一个静态方法,它会给我所有的活动订阅。然后将这些数据馈送到应用程序的其他部分。
这是通过将订阅加入用户并基于active 列进行过滤而得出的。
查询是这样的:
SELECT users.*, subscriptions.*
FROM subscriptions
JOIN users ON users.id = subscriptions.user_id
WHERE users.active = 1
订阅模式
class Subscription extends Model
{
public static function allActive()
{
// This works except it doesn't use the eloquent relationship
return static::where('users.active', 1)
->join('users', 'users.id', '=', 'subscriptions.user_id')
->select('users.*','subscriptions.*')
->get();
}
public function user()
{
return $this->belongsTo(User::class);
}
}
用户模型
class User extends Authenticatable
{
use Notifiable;
public function subscriptions()
{
return $this->hasMany(Subscription::class);
}
}
我会这样使用它:
$subscriptions = \App\Subscription::allActive()->toArray();
print_r($subscriptions);
我有 2 个问题。
如何重写
allActive函数以使用我已经定义的关系?任何解决方案都应该使用 JOIN 生成 SQL。在返回的数据中,如何将两个单独的表中的列分开,以便清楚数据来自哪个表?
【问题讨论】:
-
看看这个,希望对你有帮助stackoverflow.com/questions/26178315/…
-
为了调试你的收藏最好使用
dump($subscriptions)或dd($subscriptions),然后你可以看到更详细的信息