Php 拉威尔最新的口才

Php 拉威尔最新的口才,php,database,laravel,eloquent,relationship,Php,Database,Laravel,Eloquent,Relationship,我正在创建一个报价。我的桌子看起来像这样: quote: PK:id name FK:client_id FK:user_id created_at quoteSkus: PK:id FK:quote_id FK:sku_id price sku: PK:id name created_at 我的关系是这样的: quote: PK:id name FK:client_id

我正在创建一个报价。我的桌子看起来像这样:

quote:
    PK:id
    name
    FK:client_id
    FK:user_id
    created_at
quoteSkus:
    PK:id
    FK:quote_id
    FK:sku_id
    price
sku:
    PK:id
    name
    created_at
我的关系是这样的:

quote:
    PK:id
    name
    FK:client_id
    FK:user_id
    created_at
quoteSkus:
    PK:id
    FK:quote_id
    FK:sku_id
    price
sku:
    PK:id
    name
    created_at
Quote.php

QuotaSkus.php

sku.php

我想得到客户上次报价中为此sku设定的价格

此查询将为我提供以下信息:

SELECT * 
FROM `skus` as s 
RIGHT JOIN quoteskus as qs on qs.sku_id = s.id
RIGHT JOIN quotes as q on q.id = qs.quote_id
where s.id = 236
AND q.client_id = 2
order by q.created_at DESC
有没有可能建立一种雄辩的关系? 所以我可以

$sku = new Sku();
$sku->find(1);
$sku->lastUsage->price;

很抱歉代码转储,我试图尽可能地总结它


任何建议都会有帮助。谢谢:

您可以使用以下

$sku = Sku::find(1);
$quotesku = $sku->lastUsage->price;
和sku.php


您可以使用以下命令

$sku = Sku::find(1);
$quotesku = $sku->lastUsage->price;
和sku.php


以下是您想要的:

public function lastUsageByClient($client_id) {
    return $this->join('quoteSkus', 'sku.id', '=', 'quoteSkus.sku_id')
        ->join('quote', 'quote.id', '=', 'quoteSkus.quote_id')
        ->select('sku.*', 'quoteSkus.price')
        ->where('quote.client_id', $client_id)
        ->orderBy('quote.created_at', 'desc')
        ->first();
}
不漂亮,但应该有用

编辑:


您可能还需要在此处指定要拉入的列。

此处应该是您想要的:

public function lastUsageByClient($client_id) {
    return $this->join('quoteSkus', 'sku.id', '=', 'quoteSkus.sku_id')
        ->join('quote', 'quote.id', '=', 'quoteSkus.quote_id')
        ->select('sku.*', 'quoteSkus.price')
        ->where('quote.client_id', $client_id)
        ->orderBy('quote.created_at', 'desc')
        ->first();
}
不漂亮,但应该有用

编辑:



您可能还需要指定要在此处拉取的列。

模型通常放置在app目录中,而app\http目录通常用于控制器和中间件。你确定你的模型放在app\http\models中了吗?你有没有尝试将->orderBy'created_at',desc添加到你的lastUsage*方法中?@NIKHILNEDIYODATH是的,这是我的第一个Laravel项目,所以我不确定模型文件放在哪里。这个设置是有效的,只是不够优雅。@i-表quotesku没有一个created_at列。我不想保存此数据,因为它已经保存在quote表中。您必须使用php artisan命令@NIKHILNEDIYODATH创建模型不,您不必这样做。你应该吗?可能吧,但将现有模型复制到另一个模型,重命名类和文件并使用。模型通常放在app目录中,app\http目录通常用于控制器和中间件。你确定你的模型放在app\http\models中了吗?你有没有尝试将->orderBy'created_at',desc添加到你的lastUsage*方法中?@NIKHILNEDIYODATH是的,这是我的第一个Laravel项目,所以我不确定模型文件放在哪里。这个设置是有效的,只是不够优雅。@i-表quotesku没有一个created_at列。我不想保存此数据,因为它已经保存在quote表中。您必须使用php artisan命令@NIKHILNEDIYODATH创建模型不,您不必这样做。你应该吗?可能吧,但将现有模型复制到另一个模型、重命名类和文件并使用它并没有错。这将返回第一次使用的价格,而不是最后一次使用的价格。它也没有给我按客户端过滤的选项。传递给find的参数是sku的id。也就是说,它将返回id为1的sku实例,并存储在$sku中。lastusage是一个hasone关系,这意味着只有一个quotesku对应于一个sku。那么你必须在哪里过滤呢?lastuseage被设置为hasOne,因为我只想得到1,这是基于配额的最短的一个。我没有任何过滤功能。我的问题是,这可以用雄辩的关系来完成吗。我已经使用原始帖子中的查询完成了这项工作。@DvirLevy据我所知-您不能按客户要求筛选关系,因为它可以作为属性和方法互换使用。这将返回第一次使用的价格,而不是最后一次使用的价格。它也没有给我按客户端过滤的选项。传递给find的参数是sku的id。也就是说,它将返回id为1的sku实例,并存储在$sku中。lastusage是一个hasone关系,这意味着只有一个quotesku对应于一个sku。那么你必须在哪里过滤呢?lastuseage被设置为hasOne,因为我只想得到1,这是基于配额的最短的一个。我没有任何过滤功能。我的问题是,这可以用雄辩的关系来完成吗。我已经使用原始帖子中的查询完成了这项工作。@DvirLevy据我所知-您不能按客户要求筛选关系,因为它可以作为属性和方法互换使用。这不是使用雄辩的关系。为什么这比只运行我发布的查询要好呢?我实际上尝试在透视表上不使用外键以外的列,这样就不需要为透视表创建模型,也更容易编写代码。我对代码进行了一些微调,使其使用hasOne。如果您需要按quote和sku表中的字段进行筛选,我认为您无法避免不优雅的代码。是的,我想您是对的,这一定很混乱。在你的编辑中,你使用了hasOne,这正是我想要的,所以谢谢你!我不知道这个解决方案比我在中的查询更好还是更差,但是代码看起来更干净,所以我很高兴:这不是使用雄辩的关系。为什么这比只运行我发布的查询要好呢?我实际上试着避免在透视表上使用外键以外的列,这样就不需要为透视表创建模型,并且更容易进行wri
te代码。我对代码进行了一些微调,使其使用hasOne。如果您需要按quote和sku表中的字段进行筛选,我认为您无法避免不优雅的代码。是的,我想您是对的,这一定很混乱。在你的编辑中,你使用了hasOne,这正是我想要的,所以谢谢你!我不知道这个解决方案比我在中的查询更好还是更差,但代码看起来更干净,所以我很高兴:
public function lastUsage(){
    return $this->hasMany('\App\Http\Models\Quotesku','sku_id','id')->orderBy('created_at', 'desc')->first();
}
public function lastUsageByClient($client_id) {
    return $this->join('quoteSkus', 'sku.id', '=', 'quoteSkus.sku_id')
        ->join('quote', 'quote.id', '=', 'quoteSkus.quote_id')
        ->select('sku.*', 'quoteSkus.price')
        ->where('quote.client_id', $client_id)
        ->orderBy('quote.created_at', 'desc')
        ->first();
}
public function lastUsage() {
    return $this->hasOne('\App\Http\Models\Quotesku','sku_id','id')
        ->join('quote', 'quote.id', 'quoteSkus.quote_id')
        ->orderBy('quote.created_at', 'desc');
}