Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 根据距离归属查找记录>;归属关系_Laravel_Eloquent - Fatal编程技术网

Laravel 根据距离归属查找记录>;归属关系

Laravel 根据距离归属查找记录>;归属关系,laravel,eloquent,Laravel,Eloquent,我试图显示一个产品页面,其中包含与特定资产类型匹配的资产列表。例如,对于产品“Acme Cream”,有两个资产:nutrition-facts.pdf(文档类型)和marketing-video.mp4(视频类型)。在产品页面上,我想显示与“视频”资产类型匹配的第一个资产(如果存在) 我有以下关系: 产品模型包括一个DB列资产id 类产品扩展模型 { /** *属于产品的资产。 */ 公共职能资产() { 返回$this->belongtomany('App\Asset','product\u

我试图显示一个产品页面,其中包含与特定资产类型匹配的资产列表。例如,对于产品“Acme Cream”,有两个资产:nutrition-facts.pdf(文档类型)和marketing-video.mp4(视频类型)。在产品页面上,我想显示与“视频”资产类型匹配的第一个资产(如果存在)

我有以下关系:

产品模型包括一个DB列
资产id

类产品扩展模型
{
/**
*属于产品的资产。
*/
公共职能资产()
{
返回$this->belongtomany('App\Asset','product\u Asset');
}
}
资产模型包括数据库列
id
Asset\u type\u id

类资产扩展模型
{
/**
*获取拥有该资产的资产类型。
*/
公共功能资产类型()
{
返回$this->belongsTo('App\AssetType');
}
/**
*属于资产的产品。
*/
公共功能产品()
{
返回$this->belongtomany('App\Product','Product\u asset');
}
}
AssetType模型有两个DB列
id
name

类资产类型扩展模型
{
/**
*一个资产类型可以有许多资产
*/
公共职能资产()
{
返回$this->hasMany('App\Asset');
}
}
如何通过对资产类型进行过滤来有效地获取一个产品资产?请记住,我已经使用Product::find(id)查询了数据库,并将数据传递到视图中。这将需要另一个查询(急切加载可能会有帮助)。我知道我可以使用
foreach
循环,但在我看来,应该有一种更好、更“雄辩”的方式

我试图在产品详细信息页面(show.blade.php)的这种情况下使用它(伪代码):

如果资产匹配类型为“视频”,则在此分区中首先显示。否则,不显示该分区

看起来应该是一句简单的话:

$product->assets()->assets_type()->where('name','=','Video')->first()
到目前为止,我最接近这一点的是这个丑陋的东西:

>$product=App\product::with(['assets'])->查找(1)
>>>$product->assets()->with(['asset_type'=>function($query){$query->where('name','=','Video');}])->get()
但是,它仍然返回所有资产,除了那些不匹配的资产的“资产类型”属性为空。添加
->whereNotNull('asset\u type')->get()
只会导致找不到
asset\u type
列的错误

此外,这听起来像是一个使用“”关系的机会,但我不清楚如何建立这种关系


非常感谢您的帮助!谢谢。

您需要通过筛选加载您的关系:

假设您获取了与产品信息的关系

$typeName = 'Video';

$product = App\Product::with([
            'asset' => function($query) use($typeName) {
                //Filter asset by type
                //See: https://laravel.com/docs/5.6/eloquent-relationships#constraining-eager-loads
                return $query->whereHas('asset_type',function($query) use($typeName) {
                    //Filter where the type's name equals..
                    //Each query is relative to its scope, in this case the 'type' relationship which refers to your 'type' Model
                    return $query->where('name','=',$typeName);
                });
            },
            //Nested relationship loading: https://laravel.com/docs/5.6/eloquent-relationships#querying-relations
            'assets.asset_type'
            ])
            ->find(1);


$assets = $product->assets;
假设您只获取资产

$productId = 1;
$typeName = 'Video';

//Returns a collection of eloquent models
$assets = Asset::whereHas('product',function($query) use ($productId) {
                //Filter product by its id
                return $query->where('id','=',$productId);
            })
            ->whereHas('asset_type',function($query) use ($typeName) {
                //Filter type by its name
                return $query->where('name','=',$typeName);
            })
            ->get();

如果没有视频类型资产,则不显示产品?是否属于多个作品?据我所知,中间表是根据相关模型名称的字母顺序派生的,包含table1_id和table2_id列。非常感谢!我真是绞尽脑汁。